【问题标题】:NavigationUI not working correctly with bottom navigation view implementationNavigationUI 无法与底部导航视图实现一起正常工作
【发布时间】:2022-01-13 21:46:16
【问题描述】:

所以我有一个场景,我在底部导航中附加了 5 个片段。

1.主页 2. 收件箱 3. 搜索 4. 通知 5. 个人资料

所以我有另一个名为 (BarcodeDetail) 的片段,我从 Home Fragment 导航到该片段。

(首页 -> BarcodeDetail)

现在我从 BarcodeDetail 导航到搜索片段

(条形码详细信息 -> 搜索)

但是现在如果我从 BottomNavigationView 中选择 Home Fragment 它没有转到 Home Fragment。

而不是选择与搜索片段相同的当前片段。

(日志打印搜索片段的名称)

navController.addOnDestinationChangedListener((controller, destination, bundle) -> {

            Timber.d("Destination -> %s", destination.getDisplayName());
});

private void setupBottomNavigation() {

        NavHostFragment navHostFragment = (NavHostFragment)
                getSupportFragmentManager().findFragmentById
                        (R.id.fragment_container_view);

        if (navHostFragment != null) {

            navController = navHostFragment
                    .getNavController();

            NavigationUI.setupWithNavController(
                    binding.bottomNavigation, navController);

            initDestinationListener();

        }
    }

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:id="@+id/sellerHomeFragment"
        android:icon="@drawable/ic_home"
        android:title="@string/home_text" />

    <item
        android:id="@+id/inboxFragment"
        android:icon="@drawable/ic_chat"
        android:title="@string/chats_text" />

    <item
        android:id="@+id/searchFragment"
        android:icon="@drawable/ic_search"
        android:title="@string/search_text" />

    <item
        android:id="@+id/sellerAlertFragment"
        android:icon="@drawable/ic_notification"
        android:title="@string/notifications_text" />

    <item
        android:id="@+id/sellerProfileFragment"
        android:icon="@drawable/ic_profile"
        android:title="@string/profile_text" />

</menu>

如果您需要更多信息,请告诉我。谢谢

【问题讨论】:

    标签: android navigation bottomnavigationview


    【解决方案1】:

    我在导航组件 2.4.0 中遇到了同样的问题,切换回 2.3.5 工作正常。

    但是经过一些测试后,如果我向 BottomNavigationView 添加一个侦听器并自己处理除NavigationUI.setupWithNavController(..) 之外的导航,我也让它与 2.4.0 一起使用。

    bottomNavigationView.setOnItemSelectedListener(item -> {
       //logic like navController.popBackStack(R.id.homeFragment, false) and navController.navigate(item.getItemId(), null, options)
       return true;
    });
    

    【讨论】:

      【解决方案2】:

      2.4.0 版本开始,导航组件库默认启用多个backstack 支持,这在blog 中也得到了彻底的演示。

      根据您的示例代码,您的底部工作表导航中的五个顶级片段现在将有自己的后台堆栈,如果您想从一个顶级片段导航到另一个,就会出现问题,例如您的情况 @987654325 @。

      你不能回到Home的原因是因为你从来没有离开Home的backstack,现在Search在它上面,即导航组件认为你已经在正确的片段。

      我建议先检查导航库的最新更改,而不是尝试快速修复,因为这是一个相当大的行为更改,它也可能影响应用导航的其他部分。

      从技术上讲,底部导航的多个后退堆栈的工作方式是,每次您选择不同的底部导航选项时,onNavDestinationSelected(item: MenuItem, navController: NavController) 的实现都会弹出 并保存状态当前顶级片段中的所有片段,然后通过恢复其状态导航到另一个顶级片段。

      因此,为了像从BarcodeDetail 导航到Search 那样“从一个后台切换到另一个”,您需要至少通过以下两个选项来调整您当前的操作:

      app:popUpTo="@id/id_of_home"
      app:popUpToSaveState="true"
      

      (其中id_of_home 应该是Home 的ID,并且我假设这是以Search 为目标的操作)。

      使用这两行,您将弹出并保存 Home -&gt; BarcodeDetail 的状态并导航到 Search,如果您现在通过底部导航选项导航回 Home,那么您将恢复状态和您的导航应该基本可以了。

      但是,请注意,您可能需要其他标志,例如 app:restoreState="true" 和/或 app:popUpToInclusive="true",具体取决于您想要实现的目标。

      【讨论】:

        猜你喜欢
        • 2016-03-18
        • 1970-01-01
        • 1970-01-01
        • 2015-05-20
        • 2021-01-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多