如何在设计支持库的TabLayout中的Tabs之间设置分隔符?

Gop*_*rvi 60 android androiddesignsupport

我正在使用新android.support.design.widget.TabLayoutv7-appcompat库,并发现了一个问题,没有办法在选项卡之间设置分隔符,不知道是否有.

我已经成功配置了寻呼机适配器,并且标签看起来不错,但无法在标签之间设置分隔线.

我想要这种类型的标签

Tab1 | Tab2 | Tab3
Run Code Online (Sandbox Code Playgroud)

但目前正在展示

Tab1  Tab2  Tab3
Run Code Online (Sandbox Code Playgroud)

我的xml是

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" >

        <include layout="@layout/toolbar" />

        <android.support.design.widget.TabLayout
            android:id="@+id/tablayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/shape_tabbar_background"
            app:tabIndicatorColor="@android:color/white"
            app:tabIndicatorHeight="4dp" />
    </android.support.design.widget.AppBarLayout>

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

</android.support.design.widget.CoordinatorLayout>
Run Code Online (Sandbox Code Playgroud)

我正在添加标签

viewPager = (ViewPager) findViewById(R.id.viewpager);
    viewPager.setOffscreenPageLimit(2);
    adapter = new TabAdapterLoginActivity(getSupportFragmentManager(),
            titles);
    viewPager.setAdapter(adapter);
    tabLayout = (TabLayout) findViewById(R.id.tablayout);
    tabLayout.setupWithViewPager(viewPager);
Run Code Online (Sandbox Code Playgroud)

Ary*_*afi 66

有一种方法可以使用TabsetCustomView方法添加分隔符:

TabLayout tabLayout = (TabLayout) findViewById(R.id.tablayout);
tabLayout.setupWithViewPager(viewPager);

for (int i = 0; i < tabLayout.getTabCount(); i++) {
      TabLayout.Tab tab = tabLayout.getTabAt(i);
      RelativeLayout relativeLayout = (RelativeLayout) 
            LayoutInflater.from(this).inflate(R.layout.tab_layout, tabLayout, false);

      TextView tabTextView = (TextView) relativeLayout.findViewById(R.id.tab_title);
      tabTextView.setText(tab.getText());
      tab.setCustomView(relativeLayout);
      tab.select();
}
Run Code Online (Sandbox Code Playgroud)

使用divider选项卡自定义布局(tab_layout.xml):

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

<!-- Tab title -->
<TextView
    android:id="@+id/tab_title"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:textColor="@drawable/tab_item_selector"/>

<!-- Tab divider -->
<View
    android:layout_width="1dp"
    android:layout_height="match_parent"
    android:layout_alignParentLeft="true"
    android:background="@android:color/black" />
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)

将TabLayout选项卡水平填充设置为0dp:

<android.support.design.widget.TabLayout
        android:id="@+id/tablayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/shape_tabbar_background"
        app:tabIndicatorColor="@android:color/white"
        app:tabIndicatorHeight="4dp"

        app:tabPaddingStart="0dp"
        app:tabPaddingEnd="0dp" />
Run Code Online (Sandbox Code Playgroud)

选中标签标题文本颜色的选择器(tab_item_selector.xml):

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_selected="true" android:color="@color/abc_primary_text_material_dark" />
    <item android:state_focused="true" android:color="@color/abc_primary_text_material_dark" />
    <item android:state_pressed="true" android:color="@color/abc_primary_text_material_dark" />
    <item android:color="@color/abc_secondary_text_material_dark" />
</selector>
Run Code Online (Sandbox Code Playgroud)


Jim*_*tel 66

TabLayout实际上HorizontalScrollView它是第一个孩子LinearLayout.

所以只需使用下面的代码添加分隔符

    View root = tabLayout.getChildAt(0);
    if (root instanceof LinearLayout) {
        ((LinearLayout) root).setShowDividers(LinearLayout.SHOW_DIVIDER_MIDDLE);
        GradientDrawable drawable = new GradientDrawable();
        drawable.setColor(getResources().getColor(R.color.separator));
        drawable.setSize(2, 1);
        ((LinearLayout) root).setDividerPadding(10);
        ((LinearLayout) root).setDividerDrawable(drawable);
    }
Run Code Online (Sandbox Code Playgroud)

以下是示例屏幕截图

屏幕1 在此输入图像描述

屏幕2 在此输入图像描述

  • 此解决方案正在运行,但使用此方法后,标签在左侧有奇怪的空白区域 (3认同)
  • 好的解决方案 非常感谢.对于那些使用图像作为分隔符的人来说,图像将被TabLayout的高度拉伸,并且有一种方法可以修复它:http://stackoverflow.com/questions/10706853/android-how-to-change -Item宽度和高度 (2认同)
  • 它工作正常,但它在第一个标签之前显示分隔符,我无法删除. (2认同)