的问题是,因为你尝试用ID来获得MainFragment:当我MainFragment下面的代码始终返回null
MainFragment mainFragment = (MainFragment) fm.findFragmentById(R.id.fragment_container);
这是不对的,因为你不能确定容器内的碎片是什么。并且因为id是容器ID而不是Fragment ID。
您需要使用您已经在之前使用的标签来获取MainFragment:
fm.beginTransaction()
.add(R.id.fragment_container, MainFragment.newInstance(),"mainFragment")
.commit();
这里的标签是mainFragment
。因此,通过使用findFragmentByTag称之为:
MainFragment mainFragment = (MainFragment) fm.findFragmentByTag("mainFragment");
你只能使用findFragmentById
如果你已经宣布在布局ID的碎片的东西,如:
<fragment class="com.example.SampleFragment"
android:id="@+id/sample_fragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
然后,你可以通过它的id得到片段:
MainFragment mainFragment = (MainFragment) fm.findFragmentById(R.id.sample_fragment);
而且,你不能,如果你想通过FragmentManager加入这样以后得到它得到MainFragment:
fm.beginTransaction()
.add(R.id.fragment_container, MainFragment.newInstance(),"mainFragment")
.commit();
// This won't work!
MainFragment mainFragment = (MainFragment) fm.findFragmentByTag("mainFragment");
因为当您调用MainFragment.newInstance()
时,进程是异步的,MainFragment尚未创建。所以你会指向null。
你可能会认为'commitNow()'是同步的 –