閒來無事,記錄下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的顏色,看效果,一張圖片實現了點擊顏色變化
好像基本上遇到的問題就這些,不知道自己寫了啥,做個記錄