我有主机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);
}

最佳答案

看起来像当你打电话

mainFragment.setTextView(value);


您的电视TextView还不存在。

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

另外还有其他变体,例如:


将值存储在Singleton
将值存储在Shared Preferences
创建应使用Observer模式显示的值队列
RxRelay库中的ReplayRelay用作RxBus。其实
几乎与第三个选项相同


因此,与使用Bundle相比,样板将更少

07-25 22:53