【问题标题】:Is there a way to prevent re-create fragment in bottomNavigation when using android navigation component使用android导航组件时有没有办法防止在bottomNavigation中重新创建片段
【发布时间】:2019-09-03 14:31:37
【问题描述】:

我正在使用带有 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"/>

【问题讨论】:

  • 上次我检查时,这是一个已知问题。
  • 我想防止重新创建片段并忽略用户点击为什么?
  • 有一个技巧可以通过使用 ViewPager 和禁用滑动手势来实现。

标签: java android bottomnavigationview android-architecture-navigation


【解决方案1】:

从版本 2.2.0-alpha02 开始,这是一个已知问题,NavigationUI 未开箱即用地检查此问题。但是,有一种 hacky 方法可以实现您想要的:

navController.addOnDestinationChangedListener { _, destination, _ ->

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

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

在这里,如果 menuItem 的 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"/>

这不是最好的解决方案。但这会奏效。

希望对你有帮助。

【讨论】:

  • 您可以在底部导航栏中添加这个navView.setOnNavigationItemReselectedListener { // do nothing here, it will prevent recreating same fragment }
猜你喜欢
  • 1970-01-01
  • 2019-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-18
  • 2021-12-27
  • 1970-01-01
相关资源
最近更新 更多