的問題是,因爲你嘗試用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()'是同步的 –