web-dev-qa-db-ja.com

BottomNavigationViewに3つ以上のアイテムがあります:タブタイトルが非表示になっています

Android Support Desing Library 25を使用してBottomNavigationViewを使用しています。しかし、タブを切り替えると、他のタブのタイトルが非表示になります。しかし、実際のボトムナビゲーションビューに隠れている問題はありません。しかし、私のものは隠れています。

MyBottomNavigation

しかし、私はそのように見えたいです。それを行うためのアイデアはありますか?私は何が欠けていますか?

ActualBottomNavigation

ここに私のコードがあります:

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>
56
Yunus Haznedar

MShiftingModeフィールドが削除されたため、リフレクションを使用したソリューションは機能しなくなりました。

これを行う簡単な方法があります。サポートライブラリ28を使用して、BottomNavigationView XML宣言にapp:labelVisibilityMode="labeled"を追加するだけです。

それが役に立てば幸い。

66
Danilo Prado

UPDATE

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に更新します

ここに良い 読み取り

古いサポートライブラリの場合:

bottom_bar_menu.xmlshowAsAction属性を変更します

<item Android:id="@id/menu_item"
Android:title="text"
Android:icon="@drawable/drawable_resource_name"
Android:showAsAction="always|withText" />

build.gradleで:

compile 'com.Android.support:design:25.3.1'

ボトムナビゲーションビュー3項目以上: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);
            }
        }
    }

次を使用して呼び出します。

BottomNavigationView bottomNavigationView = (BottomNavigationView)findViewById(R.id.bottom_navigation);
BottomNavigationViewHelper.removeShiftMode(bottomNavigationView);

タイトルテキストのシフトアニメーションを無効にし、テキストを表示できるようにします。

81
rafsanahmad007

BottomNavigationViewのソースコードをスキャンすると、

mShiftingMode = mMenu.size() > 3;

BottomNavigationMenuView.Java行265では、メニューサイズが3を超える間、タブタイトルは非表示になります。したがって、タブのタイトルを表示したい場合は、ビルドからコードを取得して以下に変更するだけです。

mShiftingMode = mMenu.size() > 5;

PS:BottonNavigationViewの最大タブカウントは3〜5でなければなりません。 BottomNavigationViewNewenter image description here

10
ScuAdam

クラス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); 
8
Ram krishna

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")
    }
}
3
jpardogo

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")
    }
}
2
Karma Maker

これは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) {

    }
}
0
Istiyak

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'
0
Mujahid khan