我正在将底部导航与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"/>
答案 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"/>
这不是最佳解决方案。但这会起作用。
希望,对您有帮助。