我在使用Android支持设计库25时使用BottomNavigationView。 但是当我切换标签时,另一个标签的标题正在隐藏。但实际的底部导航视图没有隐藏问题。但是我的藏身之处。
但我希望它看起来像那样。有没有想过这样做?我错过了什么?
这是我的代码:
activity_main.xml中
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.yunus.ototakip.MainActivity">
<FrameLayout
android:id="@+id/main_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@+id/bottom_navigation"
android:layout_alignParentTop="true">
</FrameLayout>
<android.support.design.widget.BottomNavigationView
android:id="@+id/bottom_navigation"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
app:itemBackground="@color/colorPrimary"
app:itemIconTint="@color/beyaz"
app:itemTextColor="@color/beyaz"
app:menu="@menu/bottombar_menu" />
bottom_bar_menu.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/bb_menu_arac"
android:enabled="true"
android:icon="@drawable/icon_car"
android:title="@string/araclarim"
app:showAsAction="ifRoom" />
<item
android:id="@+id/bb_menu_yakin"
android:enabled="true"
android:icon="@drawable/icon_yer"
android:title="@string/yakinimdakiler"
app:showAsAction="ifRoom" />
<item
android:id="@+id/bb_menu_yaklasan"
android:enabled="true"
android:icon="@drawable/icon_takvim"
android:title="@string/yaklasanlar"
app:showAsAction="ifRoom" />
<item
android:id="@+id/bb_menu_ipucu"
android:enabled="true"
android:icon="@drawable/icon_ipucu"
android:title="@string/ipuclari"
app:showAsAction="ifRoom" />
</menu>
答案 0 :(得分:81)
<强>更新强>
不再需要removeShiftMode(),就像在支持库28.0.0-alpha1中一样,我们现在可以添加Labels。
在XML中:
<android.support.design.widget.BottomNavigationView
app:labelVisibilityMode="labeled" />
以编程方式更改:
mBottomNavigationView.setLabelVisibilityMode(LabelVisibilityMode.LABEL_VISIBILITY_LABELED);
要实现此目的:将设计支持库更新为 28.0.0-alpha1
这是一个好read
FOR OLDER SUPPORT LIBRARY:
<{1>}中的。更改bottom_bar_menu.xml
属性
showAsAction
build.gradle中的:
<item android:id="@id/menu_item"
android:title="text"
android:icon="@drawable/drawable_resource_name"
android:showAsAction="always|withText" />
BOTTOM NAVIGATIONVIEW超过3个项目:使用compile 'com.android.support:design:25.3.1'
方法
在removeShiftMode()
使用:
BottomNavigationViewHelper.java
使用以下方式调用:
import android.annotation.SuppressLint;
import android.support.design.internal.BottomNavigationItemView;
import android.support.design.internal.BottomNavigationMenuView;
import android.support.design.widget.BottomNavigationView;
import java.lang.reflect.Field;
public class BottomNavigationViewHelper {
@SuppressLint("RestrictedApi")
public static void removeShiftMode(BottomNavigationView view) {
BottomNavigationMenuView menuView = (BottomNavigationMenuView) view.getChildAt(0);
try {
Field shiftingMode = menuView.getClass().getDeclaredField("mShiftingMode");
shiftingMode.setAccessible(true);
shiftingMode.setBoolean(menuView, false);
shiftingMode.setAccessible(false);
for (int i = 0; i < menuView.getChildCount(); i++) {
BottomNavigationItemView item = (BottomNavigationItemView) menuView.getChildAt(i);
//noinspection RestrictedApi
item.setShiftingMode(false);
// set once again checked value, so view will be updated
//noinspection RestrictedApi
item.setChecked(item.getItemData().isChecked());
}
} catch (NoSuchFieldException e) {
Log.e("BottomNav", "Unable to get shift mode field", e);
} catch (IllegalAccessException e) {
Log.e("BottomNav", "Unable to change value of shift mode", e);
}
}
}
它将禁用标题文本的移动动画并启用文本显示。
答案 1 :(得分:64)
使用反射的解决方案不再起作用,因为已删除mShiftingMode字段。
现在有一种简单的方法:
使用支持库28,只需将app:labelVisibilityMode="labeled"
添加到您的BottomNavigationView
XML声明中。
希望有帮助。
答案 2 :(得分:10)
扫描完BottomNavigationView的源代码后找到
mShiftingMode = mMenu.size() > 3;
在 BottomNavigationMenuView.java 第265行,这意味着当菜单大小超过3时,标签标题将被隐藏。 因此,如果您想要显示标签标题,您只需要从构建中获取代码并将其更改为以下内容。
mShiftingMode = mMenu.size() > 5;
PS:BottonNavigationView最大标签数必须在3到5之间。 您可以在BottomNavigationViewNew上获取代码
答案 3 :(得分:8)
创建类BottomNavigationViewHelper
import android.annotation.SuppressLint;
import android.support.design.internal.BottomNavigationItemView;
import android.support.design.internal.BottomNavigationMenuView;
import android.support.design.widget.BottomNavigationView;
import android.util.Log;
import java.lang.reflect.Field;
public class BottomNavigationViewHelper {
@SuppressLint("RestrictedApi")
public static void disableShiftMode(BottomNavigationView view) {
BottomNavigationMenuView menuView = (BottomNavigationMenuView) view.getChildAt(0);
try {
Field shiftingMode = menuView.getClass().getDeclaredField("mShiftingMode");
shiftingMode.setAccessible(true);
shiftingMode.setBoolean(menuView, false);
shiftingMode.setAccessible(false);
if(menuView.getChildCount()<6)
{
for (int i = 0; i < menuView.getChildCount(); i++) {
BottomNavigationItemView item = (BottomNavigationItemView) menuView.getChildAt(i);
//noinspection RestrictedApi
item.setShiftingMode(false);
// set once again checked value, so view will be updated
//noinspection RestrictedApi
item.setChecked(item.getItemData().isChecked());
}
}
} catch (NoSuchFieldException e) {
Log.e("BNVHelper", "Unable to get shift mode field", e);
} catch (IllegalAccessException e) {
Log.e("BNVHelper", "Unable to change value of shift mode", e);
}
}
}
致电
BottomNavigationView bottomNavigationView = (BottomNavigationView)findViewById(R.id.bottom_navigation);
BottomNavigationViewHelper.disableShiftMode(bottomNavigationView);
答案 4 :(得分:3)
Kotlin扩展功能:
@SuppressLint("RestrictedApi")
fun BottomNavigationView.removeShiftMode(){
val menuView = this.getChildAt(0) as BottomNavigationMenuView
try {
val shiftingMode = menuView.javaClass.getDeclaredField("mShiftingMode")
shiftingMode.isAccessible = true
shiftingMode.setBoolean(menuView, false)
shiftingMode.isAccessible = false
for (i in 0 until menuView.childCount) {
val item = menuView.getChildAt(i) as BottomNavigationItemView
item.setShiftingMode(false)
// set once again checked value, so view will be updated
item.setChecked(item.itemData.isChecked)
}
} catch (e: NoSuchFieldException) {
e.printStackTrace()
Timber.tag("BottomNav").e( e, "Unable to get shift mode field")
} catch (e: IllegalAccessException) {
Timber.tag("BottomNav").e( e, "Unable to change value of shift mode")
}
}
答案 5 :(得分:2)
我几乎使用了rafsanahmad007 answer,但将其翻译为Kotlin。让我分享给未来的流浪者
@SuppressLint("RestrictedApi")
fun BottomNavigationView.disableShiftMode() {
val menuView = this.getChildAt(0) as BottomNavigationMenuView
try {
val shiftingMode = menuView::class.java.getDeclaredField("mShiftingMode")
shiftingMode.setAccessible(true)
shiftingMode.setBoolean(menuView, false)
shiftingMode.setAccessible(false)
for (i in 0..(menuView.childCount - 1)) {
val item = menuView.getChildAt(i) as BottomNavigationItemView
item.setShiftingMode(false)
// set once again checked value, so view will be updated
item.setChecked(item.getItemData().isChecked())
}
} catch (e: NoSuchFieldException) {
Timber.e("Unable to get shift mode field")
} catch (e: IllegalAccessException) {
Timber.e("Unable to change value of shift mode")
}
}
答案 6 :(得分:2)
app:labelVisibilityMode="labeled"
<块引用>在您的 XML 文件下添加上述代码。
示例:
xmlns:app="http://schemas.android.com/apk/res-auto"
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/bottom_nav_view"
....
....
app:labelVisibilityMode="labeled"/>
答案 7 :(得分:0)
这在API 26中对我有效:
navigation = (BottomNavigationView) view.findViewById(R.id.bottom_navigation);
try{disableShiftMode(navigation);}catch(Exception ew){}
在要调用的“活动”或“片段”中使用此方法:
@SuppressLint("RestrictedApi")
public static void disableShiftMode(BottomNavigationView view) {
BottomNavigationMenuView menuView = (BottomNavigationMenuView) view.getChildAt(0);
try {
Field shiftingMode = menuView.getClass().getDeclaredField("mShiftingMode");
shiftingMode.setAccessible(true);
shiftingMode.setBoolean(menuView, false);
shiftingMode.setAccessible(false);
for (int i = 0; i < menuView.getChildCount(); i++) {
BottomNavigationItemView item = (BottomNavigationItemView) menuView.getChildAt(i);
item.setShiftingMode(false);
item.setChecked(item.getItemData().isChecked());
}
} catch (NoSuchFieldException e) {
} catch (IllegalAccessException e) {
}
}
答案 8 :(得分:0)
快速修复,只需在xml中添加app:labelVisibilityMode =“ labeled”
<android.support.design.widget.BottomNavigationView
android:id="@+id/bottom_navigation"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
app:itemBackground="@color/colorPrimary"
app:itemIconTint="@drawable/bottom_navigation_color_selector"
app:itemTextColor="@drawable/bottom_navigation_color_selector"
app:labelVisibilityMode="labeled"
app:menu="@menu/menu_bottom_navigation" />
注意
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support:design:28.0.0'
implementation 'com.android.support:support-v4:28.0.0'
答案 9 :(得分:-1)
您可以使用它在BottomNevigationView上同时显示3到5个项目的文本和图标,并停止移动。
app:labelVisibilityMode="labeled"
但是您将在BottmNevigationView上遇到5个项目的长文本剪切问题。为此,我找到了一个很好的解决方案,用于停止文本以及BottomNevigationView的图标移动。您还可以停止移动文本以及BottomNevigationView上的图标。代码片段在此处给出。
1。如图所示,在BottomNevigationView中添加这行代码
<android.support.design.widget.BottomNavigationView
android:id="@+id/bottom_navigation"
android:layout_width="match_parent"
android:layout_height="@dimen/seventy_dp"
android:layout_semitransparent="true"
android:background="@color/colorBottomNev"
android:showAsAction="always|withText"
app:itemIconTint="@drawable/bottom_navigation_colors"
app:itemTextColor="@drawable/bottom_navigation_colors"
app:itemTextAppearanceActive="@style/BottomNavigationViewTextStyle"
app:itemTextAppearanceInactive="@style/BottomNavigationViewTextStyle"
app:menu="@menu/bottom_navigation_menu"
app:labelVisibilityMode="labeled"/>
2。添加菜单项,如下所示:-
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_catalogue"
android:icon="@drawable/catalogue"
android:title="@string/catalogue"
android:enabled="true"
app:showAsAction="ifRoom" />
<item
android:id="@+id/action_contracts"
android:icon="@drawable/contract"
android:title="@string/contracts"
android:enabled="true"
app:showAsAction="ifRoom" />
<item
android:id="@+id/action_prospects"
android:icon="@drawable/prospect"
android:title="@string/prospects"
android:enabled="true"
app:showAsAction="ifRoom" />
<item
android:id="@+id/action_performance"
android:icon="@drawable/performance"
android:title="@string/performance"
android:enabled="true"
app:showAsAction="ifRoom" />
<item
android:id="@+id/action_advance"
android:icon="@drawable/advance"
android:title="@string/advance"
android:enabled="true"
app:showAsAction="ifRoom" />
</menu>
3。在style.xml文件中添加此样式:
<style name="BottomNavigationViewTextStyle">
<item name="android:fontFamily">@font/montmedium</item>
<item name="android:textSize">10sp</item>
<item name="android:duplicateParentState">true</item>
<item name="android:ellipsize">end</item>
<item name="android:maxLines">1</item>
</style>
4)将它们添加到Dimen文件夹中
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools">
<dimen name="design_bottom_navigation_text_size" tools:override="true">10sp</dimen>
<dimen name="design_bottom_navigation_active_text_size" tools:override="true">10sp</dimen>
</resources>
我从这些link和link获得了帮助。您也可以通过研究这些链接获得帮助。这对我有很大帮助。希望这对您也有帮助。谢谢。...