getSupportFragmentManager()。findFragmentById(R.id.fragment_container)返回null
我尝试了很多解决方案,没有任何工作适合我。我已经构建了我的片段(MainFragment)以显示在主要活动中。在主要活动中,我正在使用一个FrameLayout问一个fragment_Container。getSupportFragmentManager()。findFragmentById(R.id.fragment_container)返回null
FragmentManager fm = getSupportFragmentManager();
fm.beginTransaction()
.add(R.id.fragment_container, MainFragment.newInstance(),"mainFragment")
.commit();
MainFragment mainFragment = (MainFragment) fm.findFragmentByTag("mainFragment");
的问题是,因为你尝试用ID来获得MainFragment:当我MainFragment下面的代码始终返回null
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");
你只能使用findFragmentById
如果你已经宣布在布局ID的碎片的东西,如:
<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。你的解释帮助我解决了它。 –
你可能会认为'commitNow()'是同步的 –