Android-具有CHIPS风格的自定义标签布局?

bfa*_*ahm 0 tabs android android-layout android-fragments android-studio

如何在标签中获得这种外观?
描述我需要的样式的图像

我希望它:

•根据查看的页面更改文本的颜色(我已经通过默认的supportLibrary的Widget TabLayout实现了此功能)
•更改了背景笔触的颜色
•每个选项卡元素之间都有间距(无法通过padding选项实现)

我搜索了图书馆吗,但没有任何有用的细节,实际上,我不知道在搜索栏中键入什么内容。
这种风格的名称是什么?

提前致谢。

Par*_*osh 5

输出:

在此处输入图片说明

大部分是xml定制。

style.xml

<style name="ChipTabLayout" parent="Widget.Design.TabLayout">
    <item name="tabIndicatorColor">@android:color/transparent</item>
    <item name="tabBackground">@drawable/selector_tab</item>
    <item name="tabSelectedTextColor">?android:textColorPrimary</item>
</style>
Run Code Online (Sandbox Code Playgroud)

创建以下可绘制对象

  1. chip_outline.xml
  2. chip_outline_selected.xml
  3. selector_tab.xml

chip_outline.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#FFFFFF"/>
    <stroke
            android:width="2dp"
            android:color="#B1BCBE"/>
    <corners android:radius="20dp"/>
    <padding
            android:left="16dp"
            android:top="8dp"
            android:right="8dp"
            android:bottom="8dp"/>
</shape>
Run Code Online (Sandbox Code Playgroud)

chip_outline_selected.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#B1BCBE"/>
    <stroke
            android:width="2dp"
            android:color="#B1BCBE"/>
    <corners android:radius="20dp"/>
    <padding
            android:left="0dp"
            android:top="0dp"
            android:right="0dp"
            android:bottom="0dp"/>
</shape>
Run Code Online (Sandbox Code Playgroud)

selector_tab.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/chip_outline_selected" android:state_pressed="true"/>
    <item android:drawable="@drawable/chip_outline_selected" android:state_selected="true"/>
    <item android:drawable="@drawable/chip_outline_selected" android:state_activated="true"/>
    <item android:drawable="@drawable/chip_outline" android:state_pressed="false"/>
    <item android:drawable="@drawable/chip_outline" android:state_selected="false"/>
    <item android:drawable="@drawable/chip_outline" android:state_activated="false"/>
</selector>
Run Code Online (Sandbox Code Playgroud)

工具栏xml代码

<com.google.android.material.appbar.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize">

    <androidx.appcompat.widget.Toolbar
            android:id="@+id/toolBar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            app:layout_collapseMode="pin"
            app:layout_scrollFlags="scroll|enterAlways"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
            android:layout_marginBottom="4dp"
            android:background="@android:color/white"
            android:elevation="4dp">

        <com.google.android.material.tabs.TabLayout
                android:id="@+id/tabLayout"
                style="@style/ChipTabLayout"
                android:layout_width="match_parent"
                android:layout_height="30dp"
                app:tabIndicatorHeight="30dp"
                app:tabMode="scrollable"
                android:minWidth="80dp"
                app:tabGravity="fill"
                android:layout_gravity="center"
                app:tabIndicatorGravity="center"
                android:background="@android:color/white"
                android:minHeight="?attr/actionBarSize"/>
    </androidx.appcompat.widget.Toolbar>

</com.google.android.material.appbar.AppBarLayout>
Run Code Online (Sandbox Code Playgroud)

实用程序

class Utils {
    companion object {
        fun dpToPx(dp: Int): Int {
            return ((dp * Resources.getSystem().displayMetrics.density).toInt());
        }

        fun pxToDp(px: Int, context: Context): Int {
            return ((px / Resources.getSystem().displayMetrics.density).toInt());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Java替代

在活动/片段的tabLayout.setupWithViewPager()之后添加以下代码:

for (i in 0 until binding.toolbarHolder.tabLayout.getTabCount()) {
        val tab = (binding.toolbarHolder.tabLayout.getChildAt(0) as ViewGroup).getChildAt(i)
        val p = tab.layoutParams as ViewGroup.MarginLayoutParams
        p.setMargins(Utils.dpToPx(8), 0, Utils.dpToPx(8), 0)
        tab.requestLayout()
    }
Run Code Online (Sandbox Code Playgroud)

Java替代

根据您的要求更改颜色。编码愉快!

  • 多谢!你是最棒的。 (2认同)