Java 设置textView时片段中的NPE
我有hostJava 设置textView时片段中的NPE,java,android,Java,Android,我有hostMainActivity和两个片段:MainFragment和StringsFragment 我想从StringsFragment设置TextView(位于MainFragment中)中的文本 因此在StringsFragment中,我有: public interface OnFragmentInteractionListener { void messengeFromBroadcastFragment(String value); } public void onCli
MainActivity
和两个片段:MainFragment
和StringsFragment
我想从StringsFragment
设置TextView(位于MainFragment
中)中的文本
因此在StringsFragment
中,我有:
public interface OnFragmentInteractionListener {
void messengeFromBroadcastFragment(String value);
}
public void onClick(View view) {
String myValue = "helloWorld";
mListener.messengeFromBroadcastFragment(myValue);
}
在main片段中:
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);
}
和主要活动:
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时,我得到了空指针:
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中存储值
共享首选项中存储值
Observer
模式显示的值队列ReplayRelay
作为RxBus
。事实上
几乎与第三个选项相同因此,与使用
Bundle
tv
相比,使用null
的样板文件要少一些。使用调试器找出原因。如果您仍然需要帮助,请将您的问题显示出来。每个方法都应该在一个类中。FragmentTransaction
s默认异步执行。调用main Fragment.setTextView(value)
时,Fragment
尚未创建其视图,因为tv.setText在onCreateView之前运行,但如何解决此问题?如果确实要在此处设置,请调用getSupportFragmentManager().executePendingTransactions()代码>就在commit()
之后。或者,如果您正在使用至少26.1.0版的支持库,您可以使用commitNow()
。嘿,这是关于如何为fragment提供价值的答案,但我的问题是在之后设置电视initialize@goodweather它回答了如何正确地解决你的问题。当然,您可以在延迟1秒后调用setText,在大多数情况下都可以