getSupportFragmentManager()。findFragmentById(R.id.fragment_container)返回null

时间:2017-09-12 23:54:44

标签: android android-layout android-fragments fragment android-fragmentactivity

我尝试了很多解决方案,没有什么对我有用。我已经构建了我的片段(MainFragment)以在主要活动中显示。在主要活动中,我使用 FrameLayout 询问fragment_Container。对于我的MainFragment,以下代码始终返回null:

FragmentManager fm = getSupportFragmentManager();

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

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

1 个答案:

答案 0 :(得分:1)

问题是因为您尝试使用id获取MainFragment:

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");

如果您在布局中声明了带有ID的片段,则只能使用findFragmentById

<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,则无法获取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。