寫在前面:本文僅個人開發(fā)時遇到的問題及個人解決辦法的記錄。
項目編譯版本:buildToolsVersion:"30.0.1"
新項目有使用到com.google.android.material下的TabLayout,在設(shè)計師的設(shè)計稿中,TabLayout的Indicator是固定長度的,而且比每個Tab的長度還要短,因此找了很多博客看,總結(jié)大概就是幾種方法。
一、使用反射修改,這里就不貼代碼了,百度和Google搜索一大堆。
? ? ? ? 使用反射這里不能說它有問題,因為在很多系統(tǒng)版本的手機都能使用。但是在29及以上的系統(tǒng)中,谷歌對反射的使用就限制比較嚴(yán)格,而且在28版本的時候還對內(nèi)部的方法名修改過一次。通過反射雖然可以實現(xiàn),但我個人覺得反射不夠優(yōu)雅,并且它有可能因為 SDK 的升級而失效。但這不失為當(dāng)前解決這個問題的一個方法。
二、自定義 Tab
? ? ? ??TabLayout 中的 Tab 是允許自定義的,但 Indicator 不屬于 Tab。所以有這樣一種解決方案,把 Indicator 隱藏掉,然后在自定義 Tab 的布局中加入指示線。我們可以通過把 Indicator 的顏色設(shè)為透明來隱藏它:
app:tabIndicatorColor="@android:color/transparent"
而自定義Tab就是由于在Tab中有這樣一個方法:tab.setCustomView();我們只需要自定義一個布局,在布局里面添加指示器,
然后可以使用這兩種方式:
tab.setCustomView(view);
或者 tab.setCustomView(R.layout.home_bottom_button);把布局傳遞給Tab,然后在
tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener(){})方法的listener中控制指示器顯示和隱藏(OnTabSelectedListener有三個方法)
但是這樣用的話就沒有滑動切換的動畫效果。
三、使用 Drawable 樣式(使用華為手機SDK為28的可以,19的模擬器不可以)
? ? ? ? 我自己使用的是這種方式。簡單省事,還沒那么麻煩。
??具體的借鑒參考了這篇文章:https://blog.csdn.net/u011106915/article/details/106116711? ??
提示:要把下面兩個都設(shè)置上,而且drawable中的顏色和下面設(shè)置的顏色要一致。不然有可能部分手機會無效或者下面設(shè)置的tabIndicatorColor覆蓋上面Drawable中的顏色
app:tabIndicator="@drawable/life_home_tab_indicator"
app:tabIndicatorColor="#ff080808"