Android技术知识Android开发经验谈Android开发

API 28下的TabLayout的差异

2018-09-28  本文已影响21人  VinPin

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"
上一篇 下一篇

猜你喜欢

热点阅读