使用在另一个片段(NPE)中生成的值设置片段的 TextView [重复]

Posted

技术标签:

【中文标题】使用在另一个片段(NPE)中生成的值设置片段的 TextView [重复]【英文标题】:Set TextView of a Fragment with value generated in another Fragment (NPE) [duplicate] 【发布时间】:2017-12-04 15:46:42 【问题描述】:

我有一个 Activity QuestScreen,它在创建时包含 Fragment FragmentQuest。 如果我按下按钮,这会触发屏幕活动的 next() 方法,从而将 FragmentQuest 替换为 FragmentAction。 p>

到目前为止,替换工作正常。问题是,在替换之后,我想在 FragmentAction 中设置一个 TextView,以在 QuestScreen 活动。

我的第一次尝试是将 TextView 设置在 FragmentActiononCreatView 之外。这会导致处理 TextView 的 Nullpointer 异常。

到目前为止,我看过:This、That、This 和 That

下面看到的尝试导致代码中标记了 NullpointerException。

在 QuestScreen 类中

 private void next()

    //The needed value for the TextView is stored in nextTransition
    Transition nextTransition;
    //Check if an entry is in the list
    if(quest.getTransitionsAbleToFire().size() > 0)
        nextTransition = quest.getTransitionsAbleToFire().get(0);

        fragmentAction = (FragmentAction) fm.findFragmentByTag(TAG_FRAGMENT_ACTION);

        // create the fragment and data the first time
        if (fragmentAction == null) 
            Log.d("QuestScreen onCreate" , "create fAction for first time");
            // add the fragment
            fragmentAction = (FragmentAction) Fragment.instantiate(this, FragmentAction.class.getName(), null);

            fm.beginTransaction().add(fragmentAction, TAG_FRAGMENT_ACTION).commit();
            FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
            fragmentTransaction.replace(R.id.flFragmentContainer, fragmentAction);
            fragmentTransaction.commit();
        

        //Triggers the corresponding activity in fragmentAction, to set the TextView to a value which is stored in nextTransition
        fragmentAction.nextAction(nextTransition);
        nextTransition.fire();

    
    else
        CharSequence text = "Quest END";
        int duration = Toast.LENGTH_SHORT;
        Toast toast = Toast.makeText(getApplicationContext(), text, duration);
        toast.show();
    

在 FragmentAction 类中

public class FragmentAction extends Fragment 

private TextView txtYourQuest;

@Override
public void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setRetainInstance(true);


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    // CREATE VIEWS HERE

    View layout = inflater.inflate(R.layout.content_action_fragment, container, false);
    txtYourQuest = (TextView) layout.findViewById(R.id.txtV_Your_Quest);
    return layout;


@Override
public void onActivityCreated(Bundle savedInstanceState) 
    super.onActivityCreated(savedInstanceState);


public void nextAction(Transition prmTransition)

    // --> Here in the enxt Line comes the NPE :  java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.app.Activity.findViewById(int)' on a null object reference

    FrameLayout container = (FrameLayout) getActivity().findViewById(R.id.flFragmentContainer);
    LayoutInflater.from(getActivity())
            .inflate(R.layout.content_action_fragment, container, false);

    txtYourQuest.setText("Your " + prmTransition.getAction().getPosition() + ". is to:\n "
    + prmTransition.getAction().getActionName());

【问题讨论】:

@Rotwang - OP 基本上询问如何将数据传递给 Fragment,并说以前的尝试导致了各种 NPE(毕竟应该证明自己的努力)。但是由于解决方案不是“进行空检查”,因此如果它完全是重复的,IMO 则不是最后一个链接所指的问题。请注意,这不是要重新打开,我发布了答案,因为评论太长了,我投票赞成,因为对于 SO 的新手来说,这是一个很好的问题。如果我做对了,好的复制品可能会通过指大海捞针来帮助其他人。 @0X0nosugar The attempt seen below leads to an NullpointerException marked in the code. 被称为Yust Another NPE-Related Duplicate Question @Rotwang - 好吧,所以如果这是我的问题,我应该在必要时添加空检查,然后问“为什么这段代码不起作用”? @Rotwang - 感谢您信任我避免/处理 NPE ;-) 并感谢您的耐心等待。也许这就是重点:对我来说,这是一个关于 android 机制的问题,被一些 NPE 掩盖了。使用空检查,应用程序不会崩溃。但我想“不会崩溃”并不是“任务完成”。 抱歉重复,我不知道。玩了一下代码并创建了一个解决方法。而不是使用返回 null 的 getActivity 方法。 (我认为是因为 nextAction() 是在 onCreate、onCreateView、onAttach 等之前执行的。)我现在将提交的数据存储在本地对象中,并使用该对象在 之后填充 TextView nextAction() 方法,在 onCreateView 中使用。 【参考方案1】:

Activity.findViewById(int)' 在空对象引用上

这意味着您的getActivity() 以某种方式返回null。 要找出为什么会发生这种情况,谷歌类似“getActivity()返回null”。 Here 是 *** 上此类问题的一个很好的例子。

这是摆脱崩溃的解决方法。

将活动字段添加到您的片段。

活动活动;

覆盖onAttach() 方法并将值设置为activity 字段。

@Override
public void onAttach(Activity activity) 
    super.onAttach(activity);
    this.activity = activity;

用您的activity 变量替换getActivity() 方法。

FrameLayout 容器 = (FrameLayout) activity.findViewById(R.id.flFragmentContainer);

【讨论】:

感谢您的建议。我试图按照您的建议设置一个全局变量,并偶然发现了this。但它不起作用。似乎 nextAction() 的代码在 onAttach() 方法之前执行。 (至少在我的情况下,onAttach 中的所有输出都不会显示在控制台中。)

以上是关于使用在另一个片段(NPE)中生成的值设置片段的 TextView [重复]的主要内容,如果未能解决你的问题,请参考以下文章

发送从活动数据到片段:NPE [重复]

Android - 片段的 onActivityResult() 中的 NPE

单元测试 NPE,当我添加片段自定义转换时

如何在另一个片段中访问和使用一个片段的按钮?

nginx.conf 忽略了 nginx-ingress 配置映射片段

如何在另一个片段中使用 YouTubePlayerFragment 加载 YouTubePlayer? (安卓)