getSupportFragmentManager().findFragmentById(R.id.fragment_container) returns 空
getSupportFragmentManager().findFragmentById(R.id.fragment_container) returns null
我尝试了很多解决方案,但没有一个对我有用。我已经构建了我的片段 (MainFragment) 以显示在 main activity 中。在 Main Activity 中,我使用 FrameLayout 询问 fragment_Container。对于我的 MainFragment,以下代码总是 returns null:
FragmentManager fm = getSupportFragmentManager();
fm.beginTransaction()
.add(R.id.fragment_container, MainFragment.newInstance(),"mainFragment")
.commit();
MainFragment mainFragment = (MainFragment) fm.findFragmentByTag("mainFragment");
问题是因为您尝试通过以下方式获取具有 ID 的 MainFragment:
MainFragment mainFragment = (MainFragment) fm.findFragmentById(R.id.fragment_container);
这是错误的,因为你不能确定容器中的 Fragment 是什么。而且因为 id 是容器 id 而不是片段 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 尚未创建。所以你会指向空。
我尝试了很多解决方案,但没有一个对我有用。我已经构建了我的片段 (MainFragment) 以显示在 main activity 中。在 Main Activity 中,我使用 FrameLayout 询问 fragment_Container。对于我的 MainFragment,以下代码总是 returns null:
FragmentManager fm = getSupportFragmentManager();
fm.beginTransaction()
.add(R.id.fragment_container, MainFragment.newInstance(),"mainFragment")
.commit();
MainFragment mainFragment = (MainFragment) fm.findFragmentByTag("mainFragment");
问题是因为您尝试通过以下方式获取具有 ID 的 MainFragment:
MainFragment mainFragment = (MainFragment) fm.findFragmentById(R.id.fragment_container);
这是错误的,因为你不能确定容器中的 Fragment 是什么。而且因为 id 是容器 id 而不是片段 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 尚未创建。所以你会指向空。