0

我尝试了很多解决方案,没有任何工作适合我。我已经构建了我的片段(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"); 
+0

你可能会认为'commitNow()'是同步的 –

回答

1

的问题是,因为你尝试用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。

+0

对不起! MainFragment mainFragment =(MainFragment)fm.findFragmentByTag(“mainFragment”);我已经尝试过,但仍然收到null mainFragment –

+0

您是否通过FragmentManager添加后调用它? –

+0

是的!它解决了我的问题。我对MainActvity布局进行了更改。我正在使用片段而不是FrameLayout。你的解释帮助我解决了它。 –

相关问题