Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/89.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 为什么用BottomNavigation视图显示和隐藏片段不起作用?_Android_Android Fragments_Bottomnavigationview_Fragmentmanager - Fatal编程技术网

Android 为什么用BottomNavigation视图显示和隐藏片段不起作用?

Android 为什么用BottomNavigation视图显示和隐藏片段不起作用?,android,android-fragments,bottomnavigationview,fragmentmanager,Android,Android Fragments,Bottomnavigationview,Fragmentmanager,我正在使用BottomNavigationView和其中的5个片段。我希望每个片段只创建一次,而不是每次用户在它们之间切换时都重新创建 因此,我正在创建所有片段,并尝试在片段容器中显示和隐藏它们 这是我的代码: (我用这个写这段代码) 我的问题是,MainListFragment将在打开应用程序时显示,但当我尝试转到其他片段时,什么都不会发生! 和MainListFragment将不会更改 我错在哪里 谢谢您的回答。只在主要部分留下一个替换,而不是添加: fm.beginTransaction(

我正在使用
BottomNavigationView
和其中的5个片段。我希望每个片段只创建一次,而不是每次用户在它们之间切换时都重新创建

因此,我正在创建所有片段,并尝试在片段容器中显示和隐藏它们

这是我的代码: (我用这个写这段代码)

我的问题是,
MainListFragment
将在打开应用程序时显示,但当我尝试转到其他片段时,什么都不会发生! 和
MainListFragment
将不会更改

我错在哪里


谢谢您的回答。

只在主要部分留下一个
替换
,而不是
添加

fm.beginTransaction().replace(R.id.fragment_容器,magFragment,“5”).commit()

并将其从
onCreate

fm.beginTransaction().add(R.id.fragment_container, ideaFragment, "4").commit();
fm.beginTransaction().add(R.id.fragment_container, videoFragment, "3").commit();
fm.beginTransaction().add(R.id.fragment_container, articleFragment, "2").commit();
fm.beginTransaction().add(R.id.fragment_container, mainListFragment, "1").commit();
然后,在on
onNavigationItemSelected
中执行以下操作:

switch (menuItem.getItemId()) {
    case R.id.nav_home:
        fm.beginTransaction().replace(R.id.fragment_container, magFragment, "5").commit();
        break;
    case R.id.nav_article:
        fm.beginTransaction().replace(R.id.fragment_container, articleFragment, "2").commit();
        break;
    case R.id.nav_video:
        fm.beginTransaction().replaceR.id.fragment_container, videoFragment, "3").commit();
        break;
    case R.id.nav_idea:
        fm.beginTransaction().replace(R.id.fragment_container, ideaFragment, "4").commit();
        break;
    case R.id.nav_mag:
        fm.beginTransaction().replace(R.id.fragment_container, mainListFragment, "1").commit();
        break;
}
实例化
onCreate
中的每个片段是正确的方法,这样,您就不会每次切换时都创建另一个片段。如果您想实现这种行为,您必须使用以下方法:

fm.beginTransaction().replace(R.id.fragment_container, new MagPresenter((MagContract.View) magFragment, appRepository), "1").commit();

谢谢,但这不是我想要的。正如您所说,当用户在片段之间切换时,该片段将重新创建。但我只想创建每个片段一次,然后再继续创建。不,这样就不会重新创建片段。只有在创建活动时才创建片段,然后,相同的片段用于在页面之间切换,但当我从片段1切换到片段2时,片段1将执行
ondestory
方法,因此,该片段中所有接收到的数据也将被销毁。我在代码中使用了
addToBackStack
,并将每个片段添加到堆栈中。如下所示:
fm.beginTransaction().replace(R.id.fragment_容器,mainListFragment,“1”).addToBackStack(“1”).commit()
Now on destroy将不会调用,但我的数据列表将以任何方式进行销毁。当您使用back stack时,读取onDestroy时不应调用,它应该在之前停止,在onDestroyView中,您可以测试它吗?我面临同样的问题,片段不会隐藏和显示另一个片段。你是怎么解决的?请给我点光。
fm.beginTransaction().replace(R.id.fragment_container, new MagPresenter((MagContract.View) magFragment, appRepository), "1").commit();