[android] BottomNavigationView 시프트 모드를 비활성화하는 방법은 무엇입니까?

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

추신.

의 메뉴 항목을 변경할 때마다이 방법을 실행해야합니다 BottomNavigationView.

최신 정보

또한 proguard 구성 파일 (예 : proguard-rules.pro)을 업데이트해야합니다. 위의 코드는 리플렉션을 사용하며 proguard가 mShiftingMode필드를 난독 화하면 작동하지 않습니다 .

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

가리키는 주셔서 감사합니다 무하마드 Alfaifi 이 문제를미리보기를 제공합니다 .

업데이트 2

Jolanda Verhoef가 지적한대로 새로운 지원 라이브러리 ( 28.0.0-alpha1)와 새로운 재료 구성 요소 라이브러리 ( 1.0.0-beta01)는 3 개의 메뉴 항목에서 이동 모드를 조작하는 데 사용할 수있는 공용 속성을 제공합니다.

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

재료 구성 요소 라이브러리에는 5 개의 메뉴 항목이있는 경우에도 적용됩니다.

업데이트 3

@ThomasSunderland도 지적했듯이 애니메이션 후행 을 비활성화하기 위해 접미사 app:itemHorizontalTranslation="false"없이이 속성을 false로 설정할 수 있습니다 Enabled.

여기서 BottomNavigation 스타일링에 대한 전체 가이드를 확인할 수 있습니다.


답변

지원 라이브러리 28.0.0-alpha1 이후 :

<android.support.design.widget.BottomNavigationView
    app:labelVisibilityMode="labeled" />


답변

텍스트 애니메이션을 비활성화하려면 dimens.xml 파일에서이를 사용할 수도 있습니다.

<dimen name="design_bottom_navigation_active_text_size">12sp</dimen>

매니페스트에 이것을 추가해야 할 수도 있습니다.

tools:override="true"


답변

이제 사용할 수 app:labelVisibilityMode="[labeled, unlabeled, selected, auto]"있는28-alpha

  • labeled 모든 라벨을 볼 수 있습니다.
  • unlabeled 아이콘 만 표시됩니다.
  • selected 선택한 항목 및 이동 항목의 레이블 만 표시합니다.
  • auto가지고있는 항목 수에 따라 레이블이 있거나 선택됩니다. 1-3 개 항목에 레이블이 지정되고 3 개 이상의 항목에 선택됩니다.

답변

확장 기능으로 Kotlin에서 Przemysław의 답변

@SuppressLint("RestrictedApi")
fun BottomNavigationView.disableShiftMode() {
    val menuView = getChildAt(0) as BottomNavigationMenuView
    try {
        val shiftingMode = menuView::class.java.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) {
        Log.e(TAG, "Unable to get shift mode field", e)
    } catch (e: IllegalStateException) {
        Log.e(TAG, "Unable to change value of shift mode", e)
    }
}

사용법 (Kotlin Android Extensions 사용) :

bottom_navigation_view.disableShiftMode()


답변

나를 위해 작동

bottomNavigationView.setLabelVisibilityMode(LabelVisibilityMode.LABEL_VISIBILITY_LABELED);

또는

<android.support.design.widget.BottomNavigationView
    app:labelVisibilityMode="labeled" />


답변

텍스트 애니메이션을 비활성화하고 글꼴 크기를 줄이려면 dimens.xml 파일에서 다음을 사용하십시오.

<dimen name="design_bottom_navigation_text_size">10sp</dimen>
<dimen name="design_bottom_navigation_active_text_size">10sp</dimen>