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
-Item
的 TextView
将拦截所有点击。
我们仍然希望我们的大部分 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" />
这解决了我的问题。
我正在使用 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
-Item
的 TextView
将拦截所有点击。
我们仍然希望我们的大部分 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" />
这解决了我的问题。