有没有一种方法可以防止在使用Android导航组件时在bottomNavigation中重新创建片段

时间:2019-09-03 14:31:37

标签: java android bottomnavigationview android-architecture-navigation

我正在将底部导航与android导航组件一起使用 当我单击之前选择的项目时,系统会创建该片段的新实例,替换视图上的该实例并删除最后一个片段。 我想防止重新创建片段并忽略用户点击

这是我的菜单:

<item
    android:id="@+id/historyFragment"
    android:title="@string/main_records"
    android:icon="@drawable/ic_records"
    app:showAsAction="ifRoom"/>

<item
    android:id="@+id/mainFragment"
    android:icon="@drawable/ic_pulse"
    android:title="@string/main_measure" />

<item
    android:id="@+id/settingFragment"
    android:icon="@drawable/ic_settings"
    android:title="@string/main_setting"
    app:showAsAction="ifRoom"/>

1 个答案:

答案 0 :(得分:0)

从版本2.2.0-alpha02开始,这是一个已知问题,NavigationUI并未立即进行检查。但是,有一种方法可以实现您想要的目标:

navController.addOnDestinationChangedListener { _, destination, _ ->

            for(menuItem in bottomNav.menu.iterator()){
                menuItem.isEnabled = true
            }

            val menu = bottomNav.menu.findItem(destination.id)
            menu?.isEnabled = false
}

在这里,如果菜单项的ID与目标ID相同,则我将其禁用。但是首先,我启用了所有menuItem,因为一个项目可能会被先前的迭代禁用。

在此之后,要获得样式,您需要为禁用的menuItem设置颜色。您可以通过设置以下colorState来做到这一点

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:state_checked="true"
        android:color="@color/colorPrimary" />
    <item
        android:state_checked="false"
        android:color="@color/colorAccent" />

    <item
        android:state_enabled="false"
        android:color="@color/colorPrimary" />
    <item
        android:state_enabled="true"
        android:color="@color/colorAccent" />
</selector>

最后,您需要在BottomNav中使用此颜色状态

<com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/bottomNav"
        android:layout_height="wrap_content"
        android:layout_width="match_parent"
        app:itemIconTint="@color/bottom_color_state"
        app:itemTextColor="@color/bottom_color_state"
        app:menu="@menu/menu_bottom"/>

这不是最佳解决方案。但这会起作用。

希望,对您有帮助。