0

我嘗試了很多解決方案,沒有任何工作適合我。我已經構建了我的片段(MainFragment)以顯示在主要活動中。在主要活動中,我正在使用一個FrameLayout問一個fragment_Container。getSupportFragmentManager()。findFragmentById(R.id.fragment_container)返回null

FragmentManager fm = getSupportFragmentManager(); 

fm.beginTransaction() 
    .add(R.id.fragment_container, MainFragment.newInstance(),"mainFragment") 
    .commit(); 

MainFragment mainFragment = (MainFragment) fm.findFragmentByTag("mainFragment"); 
+0

你可能會認爲'commitNow()'是同步的 –

回答

1

的問題是,因爲你嘗試用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。

+0

對不起! MainFragment mainFragment =(MainFragment)fm.findFragmentByTag(「mainFragment」);我已經嘗試過,但仍然收到null mainFragment –

+0

您是否通過FragmentManager添加後調用它? –

+0

是的!它解決了我的問題。我對MainActvity佈局進行了更改。我正在使用片段而不是FrameLayout。你的解釋幫助我解決了它。 –

相關問題