回答
是,这是可能的包装标签指示的标题设置填充到0
public void wrapTabIndicatorToTitle(TabLayout tabLayout, int externalMargin, int internalMargin) {
View tabStrip = tabLayout.getChildAt(0);
if (tabStrip instanceof ViewGroup) {
ViewGroup tabStripGroup = (ViewGroup) tabStrip;
int childCount = ((ViewGroup) tabStrip).getChildCount();
for (int i = 0; i < childCount; i++) {
View tabView = tabStripGroup.getChildAt(i);
//set minimum width to 0 for instead for small texts, indicator is not wrapped as expected
tabView.setMinimumWidth(0);
// set padding to 0 for wrapping indicator as title
tabView.setPadding(0, tabView.getPaddingTop(), 0, tabView.getPaddingBottom());
// setting custom margin between tabs
if (tabView.getLayoutParams() instanceof ViewGroup.MarginLayoutParams) {
ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) tabView.getLayoutParams();
if (i == 0) {
// left
setMargin(layoutParams, externalMargin, internalMargin);
} else if (i == childCount - 1) {
// right
setMargin(layoutParams, internalMargin, externalMargin);
} else {
// internal
setMargin(layoutParams, internalMargin, internalMargin);
}
}
}
tabLayout.requestLayout();
}
}
private void settingMargin(ViewGroup.MarginLayoutParams layoutParams, int start, int end) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
layoutParams.setMarginStart(start);
layoutParams.setMarginEnd(end);
} else {
layoutParams.leftMargin = start;
layoutParams.rightMargin = end;
}
}
简短的回答是 “不”。这是解释。
有绘制指标
@Override
public void draw(Canvas canvas) {
super.draw(canvas);
// Thick colored underline below the current selection
if (mIndicatorLeft >= 0 && mIndicatorRight > mIndicatorLeft) {
canvas.drawRect(mIndicatorLeft, getHeight() - mSelectedIndicatorHeight,
mIndicatorRight, getHeight(), mSelectedIndicatorPaint);
}
}
我相信mIndicatorLeft和mIndicatorRight是你所需要的内TabLayout私有类SlidingTabStrip
。这些字段在同一个班级设置:
private void setIndicatorPosition(int left, int right) {
if (left != mIndicatorLeft || right != mIndicatorRight) {
// If the indicator's left/right has changed, invalidate
mIndicatorLeft = left;
mIndicatorRight = right;
ViewCompat.postInvalidateOnAnimation(this);
}
}
,其中左,右参数计算在下一方法:
private void updateIndicatorPosition() {
final View selectedTitle = getChildAt(mSelectedPosition);
int left, right;
if (selectedTitle != null && selectedTitle.getWidth() > 0) {
left = selectedTitle.getLeft();
right = selectedTitle.getRight();
if (mSelectionOffset > 0f && mSelectedPosition < getChildCount() - 1) {
// Draw the selection partway between the tabs
View nextTitle = getChildAt(mSelectedPosition + 1);
left = (int) (mSelectionOffset * nextTitle.getLeft() +
(1.0f - mSelectionOffset) * left);
right = (int) (mSelectionOffset * nextTitle.getRight() +
(1.0f - mSelectionOffset) * right);
}
} else {
left = right = -1;
}
setIndicatorPosition(left, right);
}
而最糟糕的事情是,在TabLayout SlidingTabStrip领域是私人和决赛。
private final SlidingTabStrip mTabStrip;
我不明白如何在不创建全新的TabLayout的情况下实现您所需要的功能。
当我设置重力=填充和左填充和右至12,指示器停止在的结尾第二个标签标题。没有延长。如果有可能这样做,是不是有办法把其他方包起来呢? @StasMelnychenko –
“当我将重力=填充和填充左右设置为12”时 - 您在此指的是哪些属性? TabLayout? –
在XML '
如果您不需要带比文字更小,那么这应该工作:
public static void reduceMarginsInTabs(TabLayout tabLayout, int marginOffset) {
View tabStrip = tabLayout.getChildAt(0);
if (tabStrip instanceof ViewGroup) {
ViewGroup tabStripGroup = (ViewGroup) tabStrip;
for (int i = 0; i < ((ViewGroup) tabStrip).getChildCount(); i++) {
View tabView = tabStripGroup.getChildAt(i);
if (tabView.getLayoutParams() instanceof ViewGroup.MarginLayoutParams) {
((ViewGroup.MarginLayoutParams) tabView.getLayoutParams()).leftMargin = marginOffset;
((ViewGroup.MarginLayoutParams) tabView.getLayoutParams()).rightMargin = marginOffset;
}
}
tabLayout.requestLayout();
}
}
为了增加积分,您可以检查每个标题的文字大小。
我注意到肯定的SDK版本需要的,但你可以直接在做您的XML文件,使用应用程序名称空间添加填充属性。
只是让你TabLayout看起来是这样的:
<android.support.design.widget.TabLayout
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/tab"
android:layout_width="match_parent"
android:layout_height="wrap_content"
...
app:tabPaddingEnd="0dp"
app:tabPaddingStart="0dp"
</android.support.design.widget.TabLayout>
为你的父母也辣油你可以移动xmlns:app="http://schemas.android.com/apk/res-auto"
,但你的选择:)
感谢莱昂他的回答,导致我实现通过XML。
我试了2个小时的各种解决方案,但没有一个有完美的效果。
问题在于tabView的填充 - 即使我将其填充设置为全0,
不同的选项卡仍然具有不同的填充,因此TextView
中的文本大小各不相同。
然后我发现这个库完全解决了它。
https://github.com/H07000223/FlycoTabLayout
正如@Stas Melnychenko所说,除非我们重写TabLayout
,否则我们可能无法做到。而这个图书馆里重新写一个TabLayout
...
您可以使用样式做。
在布局XML:
<android.support.design.widget.TabLayout
android:id="@+id/tabs"
style="@style/AppTabLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
在styles.xml:
<style name="AppTabLayout" parent="Widget.Design.TabLayout">
<item name="android:layout_marginLeft">40dp</item>
<item name="android:layout_marginRight">40dp</item>
</style>
- 1. Controls.Add被(标签页)与TabPages.Add(标签页)
- 2. ExtJS标签页眉宽度
- 3. 左对齐JavaFX固定宽度标签页中的标签标签
- 4. 标签宽度
- 5. 如何通过标签页的名称关闭标签页上的标签页
- 6. 为标签设置标签宽度
- 7. 与标签相关
- 8. 布局与标签的基地,页脚
- 9. 相关标签
- 10. Android的标签布局将标签在屏幕的BUTTOM
- 11. 如何处理标签页按标签
- 12. 标签面板中的标签页
- 13. XUL标签页标签滚动
- 14. 在标签页
- 15. 标签页
- 16. 分页标签
- 17. 标签宽度100%
- 18. jQuery标签宽度
- 19. ActionBar标签宽度
- 20. JFreeChart标签宽度
- 21. UINavigationItem标题标签设置宽度?
- 22. Android固定标签指标宽度
- 23. 标签/ VBOX布局
- 24. 在标签布局
- 25. 标签布局问题
- 26. 标题标签位置是否与html页面相关?
- 27. Android标签布局教程?
- 28. 的Android标签布局2.1
- 29. 转换标题标签图标签
- 30. sup标签内标题标签html
谢谢@leon,它为我使用可滚动TabLayout(tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE)) – Herman
这工作。请确保你也设置了以下XML格式:app:tabPadding =“0dp” – dazza5000
对我来说工作正常 – malli