我有主机MainActivity
和2个片段:MainFragment
和StringsFragment
。
我想在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
还不存在。要修复它,您必须使用
Bundle
将String
从Activity
传递到片段。另外还有其他变体,例如:
将值存储在
Singleton
中将值存储在
Shared Preferences
中创建应使用
Observer
模式显示的值队列将RxRelay库中的
ReplayRelay
用作RxBus
。其实几乎与第三个选项相同
因此,与使用
Bundle
相比,样板将更少