Android BottomNavigationView 项目文本不可点击

Android BottomNavigationView item text not clickable

我正在使用 BottomNavigationView,但是当我准确点击项目的文本时,我无法导航到另一个项目,因为点击被拦截了。这是一个大问题,因为文本占据了按钮的一半。如果我长按它实际上会选择文本... 这是我的代码:

build.gradle

implementation "com.google.android.material:material:1.1.0"

我也尝试过 1.3.0-alpha01,但问题仍然存在。

OnNavigationItemSelectedListener 在我的 activity.

private fun getBottomNavigationItemSelectedListener() = BottomNavigationView.OnNavigationItemSelectedListener { item ->
    when (item.itemId) {
        bottomNavigation.selectedItemId -> {
            false
        }
        R.id.bottom_navigation_overview -> {
            navigateTo<OverviewActivity>()
            true
        }
        R.id.bottom_navigation_settings -> {
            navigateTo<SettingsActivity>()
            true
        }
        R.id.bottom_navigation_help -> {
            navigateTo<HelpActivity>()
            true
        }
        else -> false
    }
}

activity

的布局
<?xml version="1.0" encoding="utf-8"?> 
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <androidx.fragment.app.FragmentContainerView
        android:id="@+id/fragmentContainer"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintBottom_toTopOf="@id/bottomNavigation" />

    <com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/bottomNavigation"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        app:menu="@menu/bottom_navigation_menu"
        app:layout_constraintTop_toBottomOf="@id/fragmentContainer"
        app:labelVisibilityMode="labeled"
        app:itemHorizontalTranslationEnabled="false"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintBottom_toBottomOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

菜单布局

<?xml version="1.0" encoding="utf-8"?>
<menu
    xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/bottom_navigation_overview"
        android:enabled="true"
        android:icon="@drawable/ic_bottom_nav_overview"
        android:title="@string/BottomNavigation_overview" />
    <item
        android:id="@+id/bottom_navigation_settings"
        android:enabled="true"
        android:icon="@drawable/ic_bottom_nav_settings"
        android:title="@string/BottomNavigation_settings" />
    <item
        android:id="@+id/bottom_navigation_help"
        android:enabled="true"
        android:icon="@drawable/ic_bottom_nav_help"
        android:title="@string/BottomNavigation_help" />
</menu>

当我打开布局边界时,很明显项目文本是问题所在:

已选择第一项(没问题)

试图选择第二个项目,但文本拦截了点击

我应该怎么做才能使项目文本不拦截点击?我没有看到我所做的与 android 提供的 the examples 有什么不同,我怀疑这是默认行为。

当我写完这个问题时,我找到了问题的原因。我们让应用中的每个 TextView 都可以选择样式。

themes.xml

<style name="BaseTheme" parent="Theme.MaterialComponents.Light">
    <item name="android:textViewStyle">@style/TextViewStyle</item>
</style>

styles.xml

<style name="TextViewStyle" parent="Widget.MaterialComponents.TextView">
    <!-- other styling -->
    <item name="android:textIsSelectable">true</item>
</style>

因此 BottomNavigationView-ItemTextView 将拦截所有点击。

我们仍然希望我们的大部分 TextViews 是可选的,只是 BottomNavigationView 中的 TextView 不是。所以我创建了一个继承自 base-theme 的新主题和一个继承其他 TextView 样式的新样式:

themes.xml

<style name="BottomNavigationTheme" parent="BaseTheme">
    <item name="android:textViewStyle">@style/TextViewStyle.NoTextSelection</item>
</style>

styles.xml

<style name="TextViewStyle.NoTextSelection" parent="@style/TextViewStyle">
    <item name="android:textIsSelectable">false</item>
</style>

接下来我将主题添加到布局中的 BottomNavigationView

<com.google.android.material.bottomnavigation.BottomNavigationView
    android:id="@+id/bottomNavigation"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:theme="@style/BottomNavigationTheme"
    app:menu="@menu/bottom_navigation_menu"
    app:layout_constraintTop_toBottomOf="@id/fragmentContainer"
    app:labelVisibilityMode="labeled"
    app:itemHorizontalTranslationEnabled="false"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintBottom_toBottomOf="parent" />

这解决了我的问题。