我尝试了很多解决方案,没有什么对我有用。我已经构建了我的片段(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");
答案 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。