底部导航视图中的导航会创建/销毁导航片段。导航2.4.2。

3
我正在使用最新的导航版本2.4.2。
我按照谷歌推荐的方式,使用导航组件设置底部导航栏,具体如下:
    override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    binding = ActivityMainBinding.inflate(layoutInflater)
    setContentView(binding.root)

    val navView: BottomNavigationView = binding.navView

    val navController = findNavController(R.id.nav_host_fragment_activity_main)
    // Passing each menu ID as a set of Ids because each
    // menu should be considered as top level destinations.
    val appBarConfiguration = AppBarConfiguration(
        setOf(
            R.id.navigation_home, R.id.navigation_dashboard, R.id.navigation_notifications
        )
    )
    setupActionBarWithNavController(navController, appBarConfiguration)
    navView.setupWithNavController(navController)
}

我的菜单:
<menu xmlns:android="http://schemas.android.com/apk/res/android">

<item
    android:id="@+id/navigation_home"
    android:icon="@drawable/ic_home_black_24dp"
    android:title="@string/title_home" />

<item
    android:id="@+id/navigation_dashboard"
    android:icon="@drawable/ic_dashboard_black_24dp"
    android:title="@string/title_dashboard"
    xmlns:app="http://schemas.android.com/apk/res-auto" />

<item
    android:id="@+id/navigation_notifications"
    android:icon="@drawable/ic_notifications_black_24dp"
    android:title="@string/title_notifications" />

然而,当我从一个片段导航到另一个片段时,它的onDestroy()被调用,当我导航回来时它会被重新创建。这是BottomNavView中所有片段的情况,除了startDestination。对于startDestination,只有onCreate()被调用一次,当导航离开它时,只有onDestroyView()被调用。我希望所有其他片段都具有这种行为,因为我需要将代码放在onCreate()方法中,并希望它在应用程序生命周期内仅运行一次。支持多个后堆栈的功能已经在Navigation 2.4.0中推出,所以我不知道问题出在哪里。当调用findNavController.navigate(...)时,以前的片段保留在后堆栈中并且没有被destroyed(),据我所知,BottomNavBar调用相同的方法,所以我无法弄清楚为什么每个片段在每次导航时都会被创建/销毁。我从:起始片段->仪表板片段->导航片段->起始片段导航。

enter image description here

除了起始片段,所有的片段都会被重新创建。
任何帮助都将不胜感激。

在定义操作时,您需要说明是否要恢复状态。请在您的操作标签中尝试这样做 ==> app:restoreState="true" - Daniyal Javaid
@DaniyalJavaid,您能否请进一步澄清一下? 上述代码只是菜单项ID,在这种情况下没有任何操作。如何修复它? - Thân Hoàng
1
@ThânHoàng,这个有更新吗?我们只能在xml中的action里添加app:restoreState="true"。但是对于菜单,我们只匹配菜单中的id和我们用来创建<navigation id>的id。在NavigationUI类中,当点击menuItem时,我看到 val builder = NavOptions.Builder().setLaunchSingleTop(true).setRestoreState(true) 正在寻找解决方案。创建整个fragment似乎是多余的,我不确定为什么他们选择了这条路。 另外,AdvancedNavigationSample也产生了相同的结果。 - Bagadeshkumar R
@BagadeshkumarR 没有更新。我已经开始使用ViewPager了。 - Thân Hoàng
完全是垃圾,为什么他们不构建它,使我们可以在内存中保留片段,类似于一个分页器,毕竟只有最多5个片段(用于5个选项卡)。花了几天时间实现这个,但真希望我坚持使用老式的基于Activity的堆栈! 我还发现ViewModel被清除了(奇怪的是只有对于导航图的起始目标,而不是下面的片段) - 所以我甚至不能在ViewModel中保存状态。唯一的解决办法是将起始目标片段的ViewModel限定在Activity范围内... - undefined
1个回答

1

在 https://github.com/android/architecture-components-samples/issues/749 上,类似的回复(来自谷歌?) - zoulou

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接