Android TabLayout indicator宽度
TabLayout自适应Tab宽度
TabLayout一般就两种样式,一种是从左到右,基本上每个Tab按照文字宽度自适应。如下图:
它对应的style为:
<style name=\"StyleTabLayout\"> <item name=\"tabIndicatorFullWidth\">false <item name=\"android:textSize\">@dimen/text_size_h4_16sp <item name=\"tabTextColor\">@color/color_999999 <item name=\"tabSelectedTextColor\">@color/color_text_normal<!-- <item name=\"android:backgroundTint\">@android:color/white--> <item name=\"android:overScrollMode\">never <!-- <item name=\"tabIndicator\">@drawable/tab_indicator--> <item name=\"tabMinWidth\">80dp <item name=\"tabGravity\">fill <item name=\"tabIndicatorHeight\">1.5dp <item name=\"tabIndicator\">@drawable/tab_line_indicator <item name=\"tabIndicatorColor\">@color/color_text_normal <item name=\"tabRippleColor\">@null <item name=\"tabPaddingEnd\">12dp <item name=\"tabPaddingStart\">12dp <item name=\"tabMode\">scrollable </style>
tab_line_indicator 指示条drawable。和如何使用。
<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"> <corners android:radius=\"1dp\"/> <solid android:color=\"@color/color_text_normal\"/></shape>...<TabLayout android:background=\"@android:color/transparent\" style=\"@style/StyleTabLayout\" android:layout_width=\"match_parent\" android:layout_height=\"48dp\"/>
TabLayoutTab均分宽度
如图所示:
<TabLayout app:tabMode=\"fixed\" app:tabGravity=\"fill\" android:background=\"@android:color/transparent\" style=\"@style/StyleTabLayout\" android:layout_width=\"match_parent\" android:layout_height=\"match_parent\"/>
主要区别就是添加了tabMode fixed
, tabGravity fill
两项即可。
横线太长怎么解决?
关键的来了。indicator横线太长了。想做成如下的效果:
修改tabIndicator为如下的drawable即可:
<TabLayout ... app:tabIndicator=\"@drawable/shorten_tab_indicator\" style=\"@style/StyleTabLayout\"/>
shorten_tab_indicator
<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\" android:shape=\"rectangle\"> <item android:gravity=\"center\"> <shape> <size android:width=\"60dp\" android:height=\"1dp\" <corners android:radius=\"0.5dp\" /> <solid android:color=\"@color/color_text_normal\" /> </shape> </item></layer-list>
其他办法:
1. 反射
网上还有反射的办法:兼容性存在变更可能性:
public void setIndicatorWidth(@NonNull final TabLayout tabLayout, final int margin) { tabLayout.post(new Runnable() { @Override public void run() { try { 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); Field textViewField = tabView.getClass().getDeclaredField(\"textView\"); textViewField.setAccessible(true); TextView mTextView = (TextView) textViewField.get(tabView); tabView.setPadding(0, 0, 0, 0); int width = mTextView.getWidth(); if (width == 0) { mTextView.measure(0, 0); width = mTextView.getMeasuredWidth(); } 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(); } } }); }
2. 自定义Tab,隐藏indicator
通过自定义Tab,CustomView实现。缺点,Tab切换,没有指示器移动的动画。app:tabIndicatorColor=\"@android:color/transparent\"
3. tabindicatorFullWidth
app:tabIndicatorFullWidth=\"false\"
这个属性,只针对Tab自适应有效。如果是固定宽度的,指示器下划线与Tab同宽,不生效。