API 28下的TabLayout的差異
compileSdkVersion版本升級至28後,TabLayout使用中發現了2個差異問題。
問題1
原來使用的修改TabLayout下劃線的寬度的通用方法不好使了。
api 28之前的修改下劃線的程式碼如下:
try { // 拿到tabLayout的mTabStrip屬性 Field mTabStripField = tabLayout.getClass().getDeclaredField("mTabStrip"); mTabStripField.setAccessible(true); LinearLayout mTabStrip = (LinearLayout) mTabStripField.get(tabLayout); for (int i = 0; i < mTabStrip.getChildCount(); i++) { View tabView = mTabStrip.getChildAt(i); //拿到tabView的mTextView屬性 Field mTextViewField = tabView.getClass().getDeclaredField("mTextView"); mTextViewField.setAccessible(true); TextView mTextView = (TextView) mTextViewField.get(tabView); tabView.setPadding(0, 0, 0, 0); //因為我想要的效果是字多寬線就多寬,所以測量mTextView的寬度 int width = mTextView.getWidth(); if (width == 0) { mTextView.measure(0, 0); width = mTextView.getMeasuredWidth(); } // 設定tab左右間距,注意這裡不能使用Padding,因為原始碼中線的寬度是根據tabView的寬度來設定的 LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) tabView.getLayoutParams(); params.width = width; params.leftMargin = leftMargin; params.rightMargin = rightMargin; tabView.setLayoutParams(params); tabView.invalidate(); } } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); }
檢視api 28的Tablayout 的原始碼發現,原來的mTabStrip和mTextView已經改名為slidingTabIndicator和textView。
現修改後的程式碼如下:
try { // 拿到tabLayout的slidingTabIndicator屬性 Field slidingTabIndicatorField = tabLayout.getClass().getDeclaredField("slidingTabIndicator"); slidingTabIndicatorField.setAccessible(true); LinearLayout mTabStrip = (LinearLayout) slidingTabIndicatorField.get(tabLayout); for (int i = 0; i < mTabStrip.getChildCount(); i++) { View tabView = mTabStrip.getChildAt(i); //拿到tabView的mTextView屬性 Field textViewField = tabView.getClass().getDeclaredField("textView"); textViewField.setAccessible(true); TextView mTextView = (TextView) textViewField.get(tabView); tabView.setPadding(0, 0, 0, 0); //因為我想要的效果是字多寬線就多寬,所以測量mTextView的寬度 int width = mTextView.getWidth(); if (width == 0) { mTextView.measure(0, 0); width = mTextView.getMeasuredWidth(); } // 設定tab左右間距,注意這裡不能使用Padding,因為原始碼中線的寬度是根據tabView的寬度來設定的 LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) tabView.getLayoutParams(); params.width = width; params.leftMargin = leftMargin; params.rightMargin = rightMargin; tabView.setLayoutParams(params); tabView.invalidate(); } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); }
問題2
現在Tab的點選有水波紋的背景樣式了,不想要的話設定如下:
app:tabBackground="@null" app:tabRippleColor="@null"