web-dev-qa-db-ja.com

BottomNavigationViewは常にアイコンとテキストラベルの両方を表示します

デザインサポートライブラリバージョン25のAndroid.support.design.widget.BottomNavigationViewを使用しています

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

<Android.support.design.widget.BottomNavigationView
        Android:id="@+id/bottomBar"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:layout_alignParentBottom="true"
        Android:layout_gravity="center"
        app:itemBackground="@color/colorPrimary"
        app:menu="@menu/bottom_navigation_main"
        Android:forceHasOverlappingRendering="true"/>

@ menu/bottom_navigation_mainに3つのアクションしかない場合、アイコンとテキストラベルの両方が常に表示されます。

3つ以上のアクションがあるときに常にアイコンとテキストラベルの両方を表示する方法は何ですか。

65

まだソリューションを探していて、サードパーティのライブラリやランタイムリフレクションに依存したくない場合、Support Library 28/JetpackのBottomNavigationViewは常にテキストラベルを常にサポートしています。

これ は、探しているメソッドです。

または、XMLでapp:labelVisibilityMode="labeled"

163
shaishgandhi

2018年5月8日から更新

app:labelVisibilityMode="labeled"<Android.support.design.widget.BottomNavigationView />を直接使用できます

ソース: https://developer.Android.com/reference/com/google/Android/material/bottomnavigation/LabelVisibilityMode

長いソリューションの下でこれを必要としないでください。

前の回答

BottomNavigationViewで奇妙な動作をしました。その中のアイテム/フラグメントを選択していたとき、フラグメントはBottomNavigationViewを少し下に押すので、BottomNavigationViewのテキストは画面の下に移動します。

その奇妙な動作に直面している場合、ここに解決策があります。削除するだけ

Android:fitsSystemWindows="true"

フラグメントのルートレイアウト内。これを取り除いてブームになるだけです! BottomNavigationViewは正常に機能しますが、テキストとアイコンで表示できるようになりました。これはフラグメントのルートCoordinatorLayoutにありました。

また、追加することを忘れないでください

BottomNavigationViewHelper.removeShiftMode(bottomNavigationView);

アクティビティでシフトモードを無効にします。

そのクラスは次のとおりです。

public class BottomNavigationViewHelper {

    @SuppressLint("RestrictedApi")
    public static void removeShiftMode(BottomNavigationView view) {
        //this will remove shift mode for bottom navigation 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);
                // set once again checked value, so view will be updated
                item.setChecked(item.getItemData().isChecked());
            }

        } catch (NoSuchFieldException e) {
            Log.e("ERROR NO SUCH FIELD", "Unable to get shift mode field");
        } catch (IllegalAccessException e) {
            Log.e("ERROR ILLEGAL ALG", "Unable to change value of shift mode");
        }
    }
}
51

バージョン25では困難です。

このコードを試してください。しかし、私はそれは良い解決策ではないと思います。

BottomNavigationView navigationView = (BottomNavigationView) findViewById(R.id.bottomBar);
BottomNavigationMenuView menuView = (BottomNavigationMenuView) navigationView.getChildAt(0);
for (int i = 0; i < menuView.getChildCount(); i++) {
    BottomNavigationItemView itemView = (BottomNavigationItemView) menuView.getChildAt(i);
    itemView.setShiftingMode(false);
    itemView.setChecked(false);
}
18
STAR_ZERO

@STAR_ZEROと@ KishanSolanki124のソリューションを組み合わせたKotlin拡張関数は次のとおりです。

fun BottomNavigationView.disableShiftMode() {
    val menuView = getChildAt(0) as BottomNavigationMenuView

    menuView.javaClass.getDeclaredField("mShiftingMode").apply {
        isAccessible = true
        setBoolean(menuView, false)
        isAccessible = false
    }

    @SuppressLint("RestrictedApi")
    for (i in 0 until menuView.childCount) {
        (menuView.getChildAt(i) as BottomNavigationItemView).apply {
            setShiftingMode(false)
            setChecked(false)
        }
    }
}

使用するには:

myBottomNavigation.disableShiftMode()
10
chetbox

この効果が必要ですか?

Click here to view the image

もしそうなら、 BottomNavigationViewEx

9
ittianyu

bottomNavigationViewクラスには、BottomNavigationMenuViewフィールドがあり、BottomNavigationMenuViewには、BottomNavigationItemView []フィールドがあります。これは、ボトムバーのアイテムです。

Nがアイテムの数だとすると、BottomNavigationMenuViewは、BottomNavigationItemView []配列の各メンバーでBottomNavigationItemView.setShiftingMode(n> 3)を呼び出します。この関数は動作を決定します(タイトルを常に表示するか、選択時にのみ表示します)。

したがって、常にタイトルを表示する方法は、このメソッドを呼び出すことです。リフレクションを使用してプライベートフィールドにアクセスできます。

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


//  get the private BottomNavigationMenuView field 
        Field f = null;
        try {
            f = bottomNavigationView.getClass().getDeclaredField("mMenuView");
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
        f.setAccessible(true);
        BottomNavigationMenuView menuView=null;
        try {
             menuView = (BottomNavigationMenuView) f.get(bottomNavigationView); 
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

//  get the private BottomNavigationItemView[]  field 
        try {
            f=menuView.getClass().getDeclaredField("mButtons");
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
        f.setAccessible(true);
        BottomNavigationItemView[] mButtons=null;
        try {
            mButtons = (BottomNavigationItemView[]) f.get(menuView); 
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }


        for(int i=0;i<mButtons.length;i++){
            mButtons[i].setShiftingMode(false);
            mButtons[i].setChecked(true);
        }
5
wei wang

タイトルをすべて表示する。このKotlinコードを試してください:

@SuppressLint("RestrictedApi")
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_ofree)

    navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener)

    val menuView = navigation.getChildAt(0) as BottomNavigationMenuView
    for (i in 0 until menuView.childCount) {
        val itemView = menuView.getChildAt(i) as BottomNavigationItemView
        itemView.setShiftingMode(false)
        itemView.setChecked(false)
    }
}
4
Harry Zhang

BottomNavigationViewExの代替: BottomBar

1
Mateusz Budzisz

これを試して、私のために働いた

app:labelVisibilityMode="labeled"
1
saigopi

BottomNevigationViewでテキストとアイコンの両方を表示するためにこれを使用できます

app:labelVisibilityMode="labeled"

これを使用している場合、アイコンとテキストの両方を表示できます

<Android.support.design.widget.BottomNavigationView
    app:labelVisibilityMode="labeled"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:id="@+id/bottom_navigation_view"
    Android:layout_alignParentBottom="true"
    app:menu="@menu/bottom_navigation_menu"/>
0
Kumar Ajay A.K