问题是因为您尝试通过以下方式获取带有 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。