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>