Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 设置textView时片段中的NPE_Java_Android - Fatal编程技术网

Java 设置textView时片段中的NPE

Java 设置textView时片段中的NPE,java,android,Java,Android,我有hostMainActivity和两个片段:MainFragment和StringsFragment 我想从StringsFragment设置TextView(位于MainFragment中)中的文本 因此在StringsFragment中,我有: public interface OnFragmentInteractionListener { void messengeFromBroadcastFragment(String value); } public void onCli

我有host
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,在大多数情况下都可以