根据Google Apps中的Material Design 2自定义选定的标签指示符

时间:2019-07-26 21:23:47

标签: android material-design android-tablayout

我正在寻找一种方法,可以根据Google最新的Material Design将圆角药丸/圆角选定的标签设为指标。我已经制作了一个具有所需结果的drawable并将其实现为“ app:tabIndicator”,但是它无法正常工作。

This is what I want to achieve

  

rounded_tab_indicator.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:bottom="5dp"
        android:end="5dp"
        android:start="5dp">
        <shape
            android:shape="rectangle"
            app:tabIndicatorFullWidth="false"
            app:tabIndicatorHeight="5dp">
            <corners android:radius="8dp" />
            <solid android:color="@color/colorPrimary" />
        </shape>
    </item>
</layer-list>
  

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:context="com.example.android.tourguideapp.MainActivity">

    <com.google.android.material.appbar.AppBarLayout
        android:id="@+id/htab_appbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="?attr/colorPrimary"
        android:fitsSystemWindows="true"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

        <com.google.android.material.appbar.CollapsingToolbarLayout
            android:id="@+id/htab_collapse_toolbar"
            android:layout_width="match_parent"
            android:layout_height="256dp"
            android:fitsSystemWindows="true"
            app:contentScrim="?attr/colorPrimary"
            app:layout_scrollFlags="scroll|exitUntilCollapsed|snap"
            app:titleEnabled="false">

            <ImageView
                android:id="@+id/tour_image_view"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:background="@drawable/dscn0585"
                android:fitsSystemWindows="true"
                android:scaleType="centerCrop"
                app:layout_collapseMode="parallax"
                app:layout_collapseParallaxMultiplier="0.80" />

            <View
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:alpha="0.3"
                android:background="@android:color/black"
                android:fitsSystemWindows="true" />

            <androidx.appcompat.widget.Toolbar
                android:id="@+id/htab_toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                android:layout_gravity="top"
                android:layout_marginBottom="40dp"
                app:layout_collapseMode="pin"
                app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

            <com.google.android.material.tabs.TabLayout
                android:id="@+id/tabs"
                style="@style/CategoryTab"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_gravity="bottom"
                app:tabIndicatorHeight="5dp"
                app:tabIndicator="@drawable/rounded_tab_indicator"
                app:layout_collapseMode="pin"
                app:tabMode="scrollable" />

        </com.google.android.material.appbar.CollapsingToolbarLayout>

    </com.google.android.material.appbar.AppBarLayout>

    <androidx.viewpager.widget.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior" />

</androidx.coordinatorlayout.widget.CoordinatorLayout>

2 个答案:

答案 0 :(得分:1)

可绘制的标签指示符:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <size
        android:width="100dp"
        android:height="2dp" />
    <corners
        android:topLeftRadius="8dp"
        android:topRightRadius="8dp">
     </corners>
    <solid
        android:color="#1475e7">
    </solid>
</shape>

标签布局:

<com.google.android.material.tabs.TabLayout
    ...
    app:tabIndicatorFullWidth="false"
    app:tabIndicator="@drawable/tab_indicator"
    ... />

答案 1 :(得分:0)

当您检查TabLayout的源代码时,您会看到它绘制了您提供的可绘制的指示器,其边界是根据选项卡的大小计算得出的。为了获得共享的选项卡布局,应为可绘制对象添加填充。但是,选项卡的大小各不相同,因此您必须以百分比样式提供填充。我不知道您是否可以在xml文件中进行这种填充操作,但是可以在扩展Drawable的自定义drawable类中进行此操作。