2018年7月3日火曜日

BottomNavigationViewのテキストを常に表示する

確認バージョン

supportLibrary: '28.0.0-alpha3'

やりたいこと

BottomNavigationViewの各項目すべてのテキストを常に表示し、Shiftingさせない

対応方法

layoutのxmlファイルでBottomNavigationView にapp:labelVisibilityMode="labeled"を設定する

<android.support.design.widget.BottomNavigationView
    android:id="@+id/bottom_navigation_view"
    android:layout_width="match_parent"
    android:layout_height="56dp"
    android:layout_gravity="bottom"
    android:background="@color/white"
    app:elevation="8dp"
    app:labelVisibilityMode="labeled"
    app:itemIconTint="@color/slector_bottom_navigation"
    app:itemTextColor="@color/slector_bottom_navigation"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:menu="@menu/bottom_navigation" />


heightの56dpは、https://material.io/design/components/bottom-navigation.html#specs を参考

✕今までの対応方法(P以降の端末では正常動作しない)

val menuView = view.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 bottomNavigationItemView = menuView.getChildAt(i) as BottomNavigationItemView
        bottomNavigationItemView.setShiftingMode(false)
        bottomNavigationItemView.setChecked(false)
    }
} catch (e: NoSuchFieldException) {
    Log.d(TAG, "ERROR", e)
} catch (e: IllegalAccessException) {
    Log.d(TAG, "ERROR", e)
}

↑これだと、non-SDKのリストのリフレクションを利用しているため、
バージョンがAndroid P以降の端末でExceptionが発生するので、実装不可

0 件のコメント:

コメントを投稿