BottomNavigationView는 항상 아이콘과 텍스트 레이블을 모두 표시합니다.


125

디자인 지원 라이브러리 버전 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 개 이상의 작업이있을 때 항상 아이콘과 텍스트 레이블을 모두 표시하는 방법은 무엇입니까?


bottom_navigation_main.xml 메뉴에서 android : showAsAction = "ifRoom"이있는 경우 각 항목에 대해 android : showAsAction = "always"로 변경하십시오.
Shashank Udupa 2016

아니, 작동하지 않았습니다. 나는 전에 그것을 시도했다.
Android 개발자

당신은 당신의 메뉴 xml 파일 보여줄 수
Shashank Udupa

'<? xml version = "1.0"encoding = "utf-8"?> <menu xmlns : android = " schemas.android.com/apk/res/android"xmlns : app = " schemas.android.com/apk/ res-auto "> <item android : id ="@ + id / action_favorites "app : showAsAction ="always "/> <item android : id ="@ + id / action_schedules "app : showAsAction ="always "/> < item android : id = "@ + id / action_music"app : showAsAction = "always"/> <item android : id = "@ + id / account"android : enabled = "true"app : showAsAction = "always"/> </ menu> '
Android 개발자

4
BottomNavigationView에 app : labelVisibilityMode = "labeled"를 배치합니다.
Shrawan

답변:


327

여전히 솔루션을 찾고 있고 타사 라이브러리 또는 런타임 리플렉션에 의존하고 싶지 않은 사용자를 위해 Support Library 28 / Jetpack의 BottomNavigationView는 기본적으로 항상 텍스트 레이블이있는 것을 지원합니다.

이것이 당신이 찾고있는 방법입니다.

또는 XML에서 app:labelVisibilityMode="labeled"


어떤 라이브러리 버전이 필요합니까?
DaniloDeQueiroz

지원 라이브러리 28-alpha1 +
shaishgandhi

또한 눌렀거나 초점을 맞출 때만 아이콘 텍스트를 표시하기 위해 가시성 모드를 "자동"으로 변경할 수 있습니다. 코드 : app : labelVisibilityMode = "auto"
Kenny Dabiri

당신은 남자입니다! 최신 버전의 재료 라이브러리에서 작동 해 주셔서 감사합니다.
sud007

68

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");
        }
    }
}

이것은 STAR_ZERO의 답변과 결합하여 내 문제를 해결했습니다!
Christopher Smit

당신이 가진 부름 disableShiftMode과 수업에서 removeShiftMode. 그 작은 불일치 외에도 귀하의 답변이 문제를 해결했습니다. 이제 이동하지 않고 텍스트 + 아이콘이있는 5 개의 메뉴 항목이 있습니다. 감사합니다 아주 많이!
Yamakuzure 2018

완전한. 하단 탐색에 3 개 이상의 항목이 있으면 이동 모드가 나타납니다. 이를 사용하면 이동을 비활성화 할 수 있으므로 텍스트가있는 모든 아이콘이 한 번에 나타납니다.
Kishor Bikram Oli

1
이것은 무제한 API이며 지원 라이브러리 버전 28. +에서는 작동하지 않습니다. 받아 들여진 @shaishgandhi 대답은 그것을하는 더 적절한 방법입니다.
okarakose

19

버전 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);
}

Android Studio에서 다음과 같은 코드를 추가해야합니다.```// noinspection RestrictedApi itemView.setShiftingMode (false); // 검사 안함 RestrictedApi itemView.setChecked (false); ```
Jiezhi.G 2017-04-26

4
그것은 여전히 ​​항목을 이동합니다
CodeToLife 2017 년

1
완벽합니다! 아이콘과 텍스트를 모두 표시합니다. 그러나 이동 모드 (거짓)가 작동하지 않습니다.
Minkoo

이것은 KishanSolanki124의 답변과 함께 내 문제를 해결했습니다!
Christopher Smit

11

다음은 @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

이 효과를 원하십니까?

이미지를 보려면 여기를 클릭하십시오.

그렇다면 BottomNavigationViewEx 를 사용해 보는 것이 좋습니다 。


1
귀하의 라이브러리는 훌륭하고 인상적인 작업이지만 디자인 라이브러리 25.0.0을 사용하여이 기능을 달성하려고했습니다. 불행히도 그것은 안드로이드 디자인 관행에 위배됩니다
Android Developer

문서 의 "Fixed bottom navigation bar"에 따르면 머티리얼 디자인 사양에 위배되지 않습니다 . 또한이 멋진 라이브러리를 공유해 주셔서 감사합니다.
SERG 드 Adelantado

1
이것은 머티리얼 디자인 사양에 위배됩니다. 제공 한 문서를 읽으면 "4 개 또는 5 개의 작업이있는 경우 비활성보기를 아이콘으로 만 표시"라고 명시 적으로 표시됩니다.
Felipe

8

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"/>

6

app : labelVisibilityMode = "labeled"를 직접 사용할 수 있습니다.

<com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/bottom_navigation"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        app:labelVisibilityMode="labeled"
        android:elevation="8dp"
        android:layout_alignParentBottom="true"
        app:itemBackground="@drawable/bottom_navi"
        app:itemTextColor="@color/white"
        app:itemIconTint="@color/white"
        app:menu="@menu/bottom_nav_menu_managment" />

5

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

이것은 매우 좋습니다. BottomNavigationMenuView도 이동하지 않는지 확인해야합니다. -> f = menuView.getClass (). getDeclaredField ( "mShiftingMode"); f.setAccessible (true); f.setBoolean (menuView, false);
스테판 k.

4

제목을 끝까지 표시합니다. 이 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)
    }
}

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.