1. ホーム
  2. android

[解決済み] BottomNavigationViewのシフトモードを無効にする方法は?

2022-05-03 23:38:46

質問

BottomNavigationViewは、非アクティブなメニューのタイトルを表示しません。

bottomNavigationBarにすべてのメニュー要素のタイトルを表示するには? 問題は、私の場合、クリックされた要素のタイトルだけが表示されることです。

解決方法は?

の実装 BottomNavigationView は、項目が3つ以上の場合、シフトモードを使用するという条件があります。

現時点では既存のAPIで変更することはできず、シフトモードを無効にするためにはリフレクションを使うしかありません。

ヘルパークラスが必要です。

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 {
    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);
                //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);
        }
    }
}

そして disableShiftMode メソッドを BottomNavigationView ただし、メニュービューを自分のコードで展開する場合は、展開した後に実行する必要があることを忘れないでください。

使用例です。

BottomNavigationView bottomNavigationView = (BottomNavigationView) findViewById(R.id.bottom_navigation_bar);
BottomNavigationViewHelper.disableShiftMode(bottomNavigationView);

PS.

のメニュー項目を変更するたびに、このメソッドを実行する必要があることを覚えておいてください。 BottomNavigationView .

アップデイト

また、proguardの設定ファイル(例:proguard-rules.pro)を更新する必要があります。上記のコードはリフレクションを使用しているため、proguardが mShiftingMode フィールドがあります。

-keepclassmembers class android.support.design.internal.BottomNavigationMenuView { 
    boolean mShiftingMode; 
}

Muhammad Alfaifi さん、ご指摘ありがとうございます。 この問題 スニペットの提供 .

アップデイト2

Jolanda Verhoefが指摘したように、新しいSupportライブラリ( 28.0.0-alpha1 ) と、新しい マテリアルコンポーネントライブラリ ( 1.0.0-beta01 ) は、3つのメニュー項目のシフトモードを操作するために使用することができるパブリックプロパティを提供しています。

<com.google.android.material.bottomnavigation.BottomNavigationView
    ...
    app:labelVisibilityMode="labeled"
    ... 
/>

Material Components ライブラリでは、メニュー項目が5つある場合にも適用されます。

アップデイト3

ThomasSunderland も指摘しているように、このプロパティを false に設定することができます。 app:itemHorizontalTranslation="false" なく Enabled を追加することで、変速アニメーションを無効にすることができます。

BottomNavigation のスタイリングに関する完全なガイドを参照してください。 こちら