Gol*_*ene 7 android android-viewpager android-tablayout
我想减少指标的宽度 - 例如,使其宽度不是整个标签宽度,而是标签宽度的1/2.
这就是我需要做的全部,所以我不想下载一些自定义库并搜索我可以做到的地方.
这是一种方法吗,或者我应该自己写这样的观点?
Mav*_*ten 20
如果你想要一个固定大小的标签指示器,你可以通过 drawable 创建一个固定大小的指示器形状:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:gravity="center">
<shape android:shape="rectangle">
<solid android:color="@color/colorAccent" />
<corners
android:topLeftRadius="2dp"
android:topRightRadius="2dp" />
<size
android:width="16dp"
android:height="2dp" />
</shape>
</item>
</layer-list>
Run Code Online (Sandbox Code Playgroud)
然后在 TabLayout 上,您可以只设置选项卡指示器可绘制。同时,您还必须设置tabIndicatorColor
app:tabIndicatorColor="@color/tabIndicatorColor"
app:tabIndicator="@drawable/tab_indicator"
Run Code Online (Sandbox Code Playgroud)
因为 drawable 本身在其边界内将形状居中,所以指示器将具有固定大小。
如果您希望指示器与标签的宽度相匹配,则可以删除 tabIndicator android:gravity
。
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<solid android:color="@color/colorAccent" />
<corners
radius="2dp" />
<size
android:width="16dp"
android:height="2dp" />
</shape>
</item>
</layer-list>
Run Code Online (Sandbox Code Playgroud)
对于最终遇到此问题的任何人,我发现了一个简单的解决方案,其中包含向量可绘制对象的〜90%的制表符宽度指示器:
ic_tab_indicator_24dp:
<vector
android:height="24dp"
android:width="24dp"
android:viewportHeight="24.0"
android:viewportWidth="24.0"
xmlns:android="http://schemas.android.com/apk/res/android">
<path
android:strokeWidth="4"
android:fillColor="@android:color/white"
android:pathData="M2,0 L22,0 L22,24 L2,24 z"/>
Run Code Online (Sandbox Code Playgroud)
然后在布局中设置tabIndicator:
app:tabIndicator="@drawable/ic_tab_indicator_24dp"
Run Code Online (Sandbox Code Playgroud)
或在styles.xml中:
<item name="tabIndicator">@drawable/ic_tab_indicator_24dp</item>
Run Code Online (Sandbox Code Playgroud)
编辑:随着我的解决方案越来越引起人们的注意,我想补充一下,您只需修改pathData(“ M2,0 L22,0 L22,24 L2,24 z”)更改2和22的值即可使用宽度。应该从22中减去加到2的数量。即:“ M4,0 L20,0 L20,24 L4,24 z”或“ M6,0 L18,0 L18,24 L6,24 z” ...
尝试这个。
public void setIndicator (TabLayout tabs,int leftDip,int rightDip){
Class<?> tabLayout = tabs.getClass();
Field tabStrip = null;
try {
tabStrip = tabLayout.getDeclaredField("mTabStrip");
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
tabStrip.setAccessible(true);
LinearLayout llTab = null;
try {
llTab = (LinearLayout) tabStrip.get(tabs);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
int left = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, leftDip, Resources.getSystem().getDisplayMetrics());
int right = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, rightDip, Resources.getSystem().getDisplayMetrics());
for (int i = 0; i < llTab.getChildCount(); i++) {
View child = llTab.getChildAt(i);
child.setPadding(0, 0, 0, 0);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.MATCH_PARENT, 1);
params.leftMargin = left;
params.rightMargin = right;
child.setLayoutParams(params);
child.invalidate();
}
}
Run Code Online (Sandbox Code Playgroud)
进而
tab.post(new Runnable() {
@Override
public void run() {
setIndicator(tab,60,60);
}
});
Run Code Online (Sandbox Code Playgroud)
我的修改没有反射(应该设置自定义视图!)。
for (int i = 0; i < tabs.getTabCount(); i++) {
TabLayout.Tab tab = tabs.getTabAt(i);
if (tab != null) {
View customView = tab.getCustomView();
if (customView != null) {
View targetViewToApplyMargin = (View) customView.getParent();
ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) targetViewToApplyMargin.getLayoutParams();
layoutParams.rightMargin = totalTabMargin;
targetViewToApplyMargin.setLayoutParams(layoutParams);
}
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
9780 次 |
最近记录: |