Android(安卓)api28 tablayout改变
16lz
2021-01-26
设置tablayout下划线的宽度 (TabLayout和28之前有差异,mTabStrip已经是slidingTabIndicator了,API 28下TabLayout的差异)
两种实现方式
/** * 设置tablayout下划线的宽度 */ public static void reflex(final TabLayout tabLayout){ //了解源码得知 线的宽度是根据 tabView的宽度来设置的 tabLayout.post(new Runnable() { @Override public void run() { try { //拿到tabLayout的mTabStrip属性 LinearLayout mTabStrip = (LinearLayout) tabLayout.getChildAt(0); int dp10 = dp2px(50); for (int i = 0; i < mTabStrip.getChildCount(); i++) { View tabView = mTabStrip.getChildAt(i); //拿到tabView的mTextView属性 tab的字数不固定一定用反射取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 = 0; width = mTextView.getWidth(); if (width == 0) { mTextView.measure(0, 0); width = mTextView.getMeasuredWidth(); } //设置tab左右间距为10dp 注意这里不能使用Padding 因为源码中线的宽度是根据 tabView的宽度来设置的 LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) tabView.getLayoutParams(); params.width = width ; params.leftMargin = dp10; params.rightMargin = dp10; tabView.setLayoutParams(params); tabView.invalidate(); } } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } }); }
public static void setIndicatorWidth(@NonNull final TabLayout tabLayout, final int margin) { tabLayout.post(new Runnable() { @Override public void run() { 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 = margin; params.rightMargin = margin; tabView.setLayoutParams(params); tabView.invalidate(); } } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } }); }
原简书博文,现迁至这
更多相关文章
- 设置布局默认为LinearLayout,却成了RelativeLayout
- Android(安卓)Studio的下载、安装与配置
- 一步一步学android之布局管理器——LinearLayout
- Android:TextView显示富文本信息
- android Activity窗体显示状态设置
- Android中WebView使用解析
- Android(安卓)MediaRecorder录制音频的方法
- 代码实现android的一个登录界面
- Android使用高德地图地理围栏定位自动发送短信