Android之BottomNavigationView遇到的問題

閒來無事,記錄下BottomNavigationView的使用,是design庫下的控件,主要作用就是實現app主頁面的底部導航效果
首先新建個項目選擇Bottom Navigation Activity的mobile,如下圖所示:
這裏寫圖片描述

添加完項目主界面基本上也就完成了,看下運行效果:
這裏寫圖片描述
是不是感覺超簡單的,不用吹灰之力一個主界面就亮閃閃的登場了
下面我來講講在使用這個控件的時候遇到的問題
一、修改app的主題
新建項目默認的自帶的主題是android:theme=”@style/AppTheme”,主題在清單文件application設置,應該不會不懂,啊哈哈!
很多時候我們不會用自帶的bar,所以會修改主題爲android:theme=”@android:style/Theme.NoTitleBar”,那麼和我一樣會這麼做的人重新運行項目的時候一定會報錯

Caused by: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.

這是因爲我們的activity繼承了 AppCompatActivity()只要修改繼承activity或FragmentActivity,繼續運行,又報一個新的錯

Caused by: android.view.InflateException: Binary XML file line #0: Binary XML file line #0: 
Error inflating class android.support.design.widget.BottomNavigationView

這是因爲我們修改了application的主題導致,所以我們在BottomNavigationView中添加下主題,如下所示

<android.support.design.widget.BottomNavigationView
        android:id="@+id/navigation"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginEnd="0dp"
        android:layout_marginStart="0dp"
        android:background="?android:attr/windowBackground"
        android:theme="@style/AppTheme"
        app:itemTextColor="@drawable/text_color"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:menu="@menu/navigation" />

二、添加menu

直接來張圖看問題
這裏寫圖片描述
很明顯每個item的佔用比率不一致,選中的的item佔了一個較大的位置,且未選中的item底下的文字也不見了
解決方式:
https://stackoverflow.com/questions/40176244/how-to-disable-bottomnavigationview-shift-mode這是別人寫好的啦!我是幫運工
使用下面的類BottomNavigationViewHelper通過反射來修改

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

    }
}

然後在activity中使用:BottomNavigationViewHelper.disableShiftMode(navigation)
navigation是控件BottomNavigationView,寫的方式是kotlin所以如果直接用java的需要自己再去百度了。
看下效果,完美
這裏寫圖片描述
三、修改選中顏色
BottomNavigationView爲我們提供了兩個屬性itemIconTint、itemTextColor分別是給圖片和文字修改顏色,假如我們未設置這兩個屬性默認顏色跟隨主題顏色

app:itemIconTint="@color/bottom_icon_color"
app:itemTextColor="@color/bottom_icon_color"

主題顏色:藍色
這裏寫圖片描述
設置了兩個屬性的顏色:黑色
這裏寫圖片描述
接下來設置選中和爲選中的圖片和文字顏色
新建一個選擇器home_bg.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_checked="true" android:drawable="@mipmap/home_top"></item>
    <item android:drawable="@mipmap/home"></item>
</selector>

對應的兩張圖片:
這裏寫圖片描述這裏寫圖片描述
menu中添加item的icon爲home_bg
這裏寫圖片描述
運行看效果:
選中效果:這裏寫圖片描述未選中:這裏寫圖片描述
爲什麼我的粉粉少女心的圖標也變黑色了,這是因爲item的圖標被設置爲統一顏色,所以我們在代碼中設置itemIconTintList爲null,這樣圖標的原顏色就顯示出來了

navigation.itemIconTintList = null

這裏寫圖片描述
文字設置顏色

app:itemTextColor="@drawable/text_color"

第二種設置顏色的方法:

navigation.itemIconTintList = resources.getColorStateList(R.drawable.text_color, null);
navigation.itemTextColor = resources.getColorStateList(R.drawable.text_color, null);

text_color.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_checked="true" android:color="@color/colorAccent"></item>
    <item android:color="@color/colorPrimary"></item>
</selector>

menu文件沒變,collect這個item我只設置了一張圖片,但是我在代碼中設置了icon和text的顏色,看效果,一張圖片實現了點擊顏色變化
這裏寫圖片描述

好像基本上遇到的問題就這些,不知道自己寫了啥,做個記錄

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章