【问题标题】:getSupportFragmentManager().findFragmentById(R.id.fragment_container) returns nullgetSupportFragmentManager().findFragmentById(R.id.fragment_container) 返回 null
【发布时间】:2017-09-12 23:54:43
【问题描述】:

我尝试了很多解决方案,但对我没有任何帮助。我已经构建了我的片段(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");

【问题讨论】:

  • 你可以考虑commitNow() 同步

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


【解决方案1】:

问题是因为您尝试通过以下方式获取带有 id 的 MainFragment:

MainFragment mainFragment = (MainFragment) fm.findFragmentById(R.id.fragment_container);

这是错误的,因为您无法确定容器中的 Fragment 是什么。而且因为 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 的 Fragment,则只能使用 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,则无法获取它:

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。

【讨论】:

  • 对不起! MainFragment mainFragment = (MainFragment) fm.findFragmentByTag("mainFragment");我已经尝试过了,但我仍然得到 null mainFragment
  • 你是通过FragmentManager添加后直接调用的吗?
  • 是的!它解决了我的问题。我对 MainActvity 布局进行了更改。我使用的是片段而不是 FrameLayout。您的解释帮助我解决了这个问题。
  • 很好!如果对您有帮助,您可以接受我的回答。 ;)
  • @ישואוהבאותך 嗨(היי),如果 MainFragment.newInstance 是一个静态方法,你能解释一下这里的异步是什么吗? MainFragment.newIntance() 不会立即重新输入片段吗?我会很高兴理解它。提前致谢
猜你喜欢
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多