Android标签布局:相对于标签标题包裹标签指示符宽度

Nar*_*C.R 24 android android-layout android-tablayout

是否有任何方法可以相对于标题标题包裹标签指示符宽度?

当前

需要

leo*_*eon 31

是的,可以将标签指示符作为标题设置填充包装为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
                        settingMargin(layoutParams, externalMargin, internalMargin);
                    } else if (i == childCount - 1) {
                        // right
                        settingMargin(layoutParams, internalMargin, externalMargin);
                    } else {
                        // internal
                        settingMargin(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);
        layoutParams.leftMargin = start;
        layoutParams.rightMargin = end;
    } else {
        layoutParams.leftMargin = start;
        layoutParams.rightMargin = end;
    }
}
Run Code Online (Sandbox Code Playgroud)

结果

编辑:从现在开始com.android.support:design:28.0.0,您可以轻松地将指标调整为标签:

app:tabIndicatorFullWidth="false"

  • externalMargin和internalMargin的值是什么?我已经给出了0,0只有当tabMode = scrollable时才能工作,而不能用于tabMode = fixed (5认同)
  • 它对我不起作用..我需要解决方案。我正在使用 tablayout &lt;android.support.design.widget.TabLayout android:id="@+id/sub_tabs" android:layout_width="fill_parent" app:tabBackground="@color /bgdarkblue" app:tabTextColor="@color/colorWhite" app:tabIndicatorColor="@color/barColor" android:theme="@style/tabTheme" app:tabPadding="0dp" android:layout_height="48dp"/&gt; 我我正在使用两个标签,但它仍然填充了一半宽度......我不知道为什么会这样。你能给出一些解决方案吗 (2认同)

Mal*_*azi 13

从支持库28开始,您可以执行以下操作:

app:tabIndicatorFullWidth="false"
app:tabPaddingStart="25dp"
app:tabPaddingEnd="25dp"
Run Code Online (Sandbox Code Playgroud)

您可以设置影响选项卡指示符的所需填充.

你现在也可以这样做:

app:tabIndicator="@drawable/tab_indicator"
Run Code Online (Sandbox Code Playgroud)

这将设置一个自定义drawable作为指标.

自定义drawable的示例:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">

    <solid android:color="@color/colorPrimary"/>
    <corners android:radius="5dp"/>
</shape>
Run Code Online (Sandbox Code Playgroud)

  • 如何设置固定选项卡指示器?通过使用此属性 app:tabIndicatorFullWidth="false",选项卡指示器宽度将根据选项卡文本宽度进行更改。我想要固定宽度的选项卡指示器,我怎样才能实现这一点? (2认同)

Eri*_*k B 9

在此输入图像描述

如果你不需要条带小于文本,那么这应该工作:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

对于添加的点,您可以检查每个标题的文本大小.


小智 7

一种简单的解决方案是:

tabLayout.setTabIndicatorFullWidth(false);
Run Code Online (Sandbox Code Playgroud)

但它适用于最新的依赖项,例如

implementation 'com.android.support.constraint:constraint-layout:1.1.2'
implementation 'com.android.support:design:28.0.0'
Run Code Online (Sandbox Code Playgroud)


小智 5

你可以这样做:

布局/layout_demo.xml

<com.google.android.material.tabs.TabLayout
    app:tabIndicatorFullWidth="false"
    app:tabIndicator="@drawable/tab_indicator"
    .../>
Run Code Online (Sandbox Code Playgroud)

res/tab_indicator.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:gravity="center">
    <shape>
        <size
            android:width="51dp"
            android:height="3dp" />
    </shape>
</item>
</layer-list>
Run Code Online (Sandbox Code Playgroud)