设置textView时片段中的NPE

时间:2018-03-01 18:27:18

标签: java android

我有MainActivity个帖子和2个片段:MainFragmentStringsFragment

我想在MainFragment的TextView(位于StringsFragment)中设置文字。

所以在StringsFragment我有:

public interface OnFragmentInteractionListener {
    void messengeFromBroadcastFragment(String value);
}

public void onClick(View view) {
    String myValue = "helloWorld";
    mListener.messengeFromBroadcastFragment(myValue);
}

在MainFragment中:

TextView tv;

    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_main, container, false);
        tv = view.findViewById(R.id.tv);
        return view;
    }

    public void setTextView(String value){
        tv.setText(value);
    }

和MainActivity:

public void messengeFromBroadcastFragment(String value) {
    mainFragment = new MainFragment();
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    transaction.replace(R.id.fragmentContainer, mainFragment);
    transaction.addToBackStack(null);
    transaction.commit();
    mainFragment.setTextView(value);
}

当我从StringsFragment调用onClick时,我得到了nullpointer:

setText(java.lang.CharSequence)' on a null object reference

从这里

public void setTextView(String value){
    tv.setText(value);
}

1 个答案:

答案 0 :(得分:1)

当你打电话时看起来像

mainFragment.setTextView(value);

您的电视TextView尚不存在。

要修复它,您必须使用BundleStringActivity传递到片段。

还有另外一些变体,如:

  1. 将值存储在Singleton
  2. 将值存储在Shared Preferences
  3. 创建应使用Observer pattern
  4. 显示的值队列
  5. RxRelay库中的ReplayRelay用作RxBus。其实 与第三个选项几乎相同
  6. 因此,使用Bundle

    的样板量会少一些