【问题标题】:How to set the divider between Tabs in TabLayout of design support library?如何在设计支持库的 TabLayout 中设置 Tab 之间的分隔符?
【发布时间】:2015-08-25 12:35:01
【问题描述】:

我在使用v7-appcompat库新的android.support.design.widget.TabLayout,发现一个问题,选项卡之间没有办法设置分隔符,不知道有没有。

我已成功配置寻呼机适配器,选项卡看起来不错,但无法设置选项卡之间的分隔符。

我想要这种类型的标签

Tab1 | Tab2 | Tab3

但目前它正在显示

Tab1  Tab2  Tab3

我的 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>

我正在通过这个添加标签

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);

【问题讨论】:

  • 您是否以编程方式尝试过?例如` mTab​​Host.getTabWidget().setDividerDrawable(R.Color.Blue);`
  • 请按照你的风格设置这个@color/your_color
  • 我使用 JakeWharton 的标签页 ViewPagerIndicator,它解决了目的

标签: android androiddesignsupport


【解决方案1】:

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);
    }

以下是示例屏幕截图

屏幕 1

屏幕 2

【讨论】:

  • 不错的解决方案!太感谢了。对于使用图片作为分隔线的人,图片会被TabLayout的高度拉长,有办法解决:stackoverflow.com/questions/10706853/…
  • 应该是选择的答案
  • 这是最简单的方法。谢谢。
  • 它工作正常,但在我无法删除的第一个选项卡之前显示分隔符。
  • 此解决方案有效,但使用此方法后选项卡左侧有奇怪的空白
【解决方案2】:

有一种方法可以使用Tab setCustomView 方法添加分隔线:

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();
}

带有分隔符的选项卡自定义布局 (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>

将 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" />

当它被选中时,标签标题文本颜色的选择器(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>

【讨论】:

  • 出于某种奇怪的原因,对我来说它看起来像| Tab1 | Tab2 | Tab3
  • 这是因为布局中的制表符分隔符左对齐。您可以将属性 android:layout_alignParentLeft="true" 更改为 android:layout_alignParentRight="true"。此外,如果您希望在第一个选项卡上隐藏分隔符,您可以在 tab_layout.xml 中为其分配一个 id,通过代码中的 findViewById() 方法获取它并将其可见性设置为 GONE(如果 i == 0 在 for 循环中)。
  • 这有效..但它选择了第二个标签。如果我以编程方式更改为第一个选项卡,则文本颜色看起来未被选中。
  • @user3289108 你有没有找到任何解决方案来选择第一个标签?如果我不单击任何其他选项卡,我永远不会被选中并且 xml 扇区不适用于第一个选项卡。
  • for (int i = 1;...) 应该从第一个选项卡中删除分隔符,Horizontal 中的LinearLayout orientation 应该进一步简化布局。
【解决方案3】:

我认为这是不可能的,除非在创建选项卡期间指定一个 customView 并添加你的分隔符,例如;一个 TextView 和你明确地TextView.setCompoundDrawablesWithIntrinsicBounds(0, 0,(int)id_of_a_divider, 0);

就像你尝试检测它是否是第一个 Tab

if(firstTab){
    tabLayout.getTabAt(0).getCustomView()
    .setCompoundDrawablesWithIntrinsicBounds(0, 0,(int)id_of_a_divider, 0);
    //some little casting
}else if(lastTab){
  //dont get any
   tabLayout.getTabAt(index).getCustomView()
    .setCompoundDrawablesWithIntrinsicBounds(0,0,0, 0);
 else{
    //the rest takes two sides,
     tabLayout.getTabAt(index).getCustomView()
    .setCompoundDrawablesWithIntrinsicBounds((int)id_of_a_divider
       , 0,(int)id_of_a_divider, 0);

希望你明白我的意思

【讨论】:

  • 您确定没有其他方法或任何内置功能可用吗?
  • 只有在没有矛盾证据的情况下才是正确的,让我们等到它被反驳,但如果你查看 TabLayout 文档,你看不到任何类似的东西。所以我很确定,直到我不是,但现在你可以欣赏我的努力。 :)@GopalSinghSirvi 非常适合您可以使用 xml 和样式的其他方式,这就是我的英特尔可以到达的地方。
【解决方案4】:

你可以试试这个解决方法我做了如下:-

1-创建普通的tablayout。

2-将模式设为 MODE_FIXED

2-在framellayout中添加它,在它上面添加线性布局horizo​​ntal。

3-在水平布局中添加按钮作为选项卡的数量,并使每个按钮的按钮大小 layout_wight=1。

4-使按钮背景透明。

通过 view 或 anyview 在水平线性布局布局中的按钮之间添加 spertator,并将宽度指定为 0.5dp 或您想要的任何厚度。

4-您可以添加或单击按钮或将按钮更改为不处理单击的任何其他视图,以便其下的选项卡将执行单击操作:)。

这可能是丑陋的解决方案,但它可以完美地完成工作

另一个提示,如果您想更改所选选项卡的背景,您可以使选项卡布局样式中的指示器高度等于选项卡布局的实际高度。

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/transparent"
    android:orientation="vertical">


    <FrameLayout
        android:id="@+id/content_parent"

        android:layout_width="fill_parent"
        android:layout_height="fill_parent">


        <android.support.v4.view.ViewPager
            android:id="@+id/viewpager"
            android:layout_width="match_parent"
            android:layout_height="fill_parent"
            android:layout_weight="1"

            android:background="@android:color/transparent" />




        <android.support.design.widget.TabLayout
            android:id="@+id/sliding_tabs"
            style="@style/MyCustomTabLayout"
            android:layout_width="match_parent"
            android:layout_height="60dp"
            android:layout_gravity="bottom"
            android:background="#99888888"
            android:clickable="false"
            android:layoutDirection="rtl"

              />


        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="0.5dp"
            android:layout_gravity="bottom"
            android:layout_marginBottom="60dp"
            android:background="#60ffffff"></LinearLayout>

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="60dp"
            android:layout_gravity="bottom|right"
            android:background="@android:color/transparent"
            android:orientation="horizontal">


            <Button
                android:id="@+id/button1"
                android:layout_width="match_parent"
                android:layout_height="60dp"
                android:layout_weight="1"
                android:background="@android:color/transparent"
                android:clickable="true" />



            <LinearLayout
                android:layout_width="0.5dp"
                android:layout_height="60dp"
                android:background="#60ffffff"></LinearLayout>

            <Button
                android:id="@+id/button2"
                android:layout_width="match_parent"
                android:layout_height="60dp"
                android:layout_weight="1"
                android:background="@android:color/transparent"
                android:clickable="true"

                />

            <LinearLayout
                android:layout_width="0.5dp"
                android:layout_height="60dp"
                android:background="#60ffffff"></LinearLayout>

            <Button
                android:id="@+id/button3"
                android:layout_width="match_parent"
                android:layout_height="60dp"
                android:layout_weight="1"
                android:background="@android:color/transparent"
                android:clickable="true"

                />

            <LinearLayout
                android:layout_width="0.5dp"
                android:layout_height="60dp"
                android:background="#60ffffff"></LinearLayout>

            <Button
                android:id="@+id/button4"
                android:layout_width="match_parent"
                android:layout_height="60dp"
                android:layout_weight="1"
                android:background="@android:color/transparent"
                android:clickable="true"

                />

            <LinearLayout
                android:layout_width="0.5dp"
                android:layout_height="60dp"
                android:background="#60ffffff"></LinearLayout>

            <Button
                android:id="@+id/button5"
                android:layout_width="match_parent"
                android:layout_height="60dp"
                android:layout_weight="1"
                android:background="@android:color/transparent"
                android:clickable="true"

                />

        </LinearLayout>

    </FrameLayout>

这是风格

 <style name="MyCustomTabLayout" parent="Widget.Design.TabLayout">
        <item name="tabIndicatorColor">#50000000</item>
        <item name="tabTextAppearance">@style/MyCustomTabTextAppearance</item>
        <item name="tabIndicatorHeight">60dp</item>
        <item name="tabSelectedTextColor">#222222</item>

【讨论】:

  • 自定义视图将是一种更优雅的处理方式,但就像你说的那样,这确实有效。尽管对于某些视图来说这样做可能不可行,因为您需要知道每个选项卡的确切宽度,否则分隔线将不会均匀分布。这也只有在选项卡的数量是静态的并且在编译时间之前知道的情况下才有效。
【解决方案5】:

不是最好的,而是我用于当前的替代方式。

在 Main.Xml 中

<android.support.design.widget.TabLayout
    android:id="@+id/tabs"
    style="@style/Base.Widget.Design.TabLayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/master_color"
    app:elevation="0dp"
    app:tabMode="scrollable"
    app:tabPaddingEnd="2dp"
    app:tabPaddingStart="0dp"
    app:tabSelectedTextColor="@color/white"
    app:tabTextColor="#82c6e6" />

我正在使用片段并在onCreate() 中做类似

if (savedInstanceState == null) {
    replaceFragment(fragmentOne);
}

设置标签

private void setupTabLayout() {

    fragmentOne = new FragmentOne();
    fragmentTwo = new FragmentTwo();

    allTabs.addTab(allTabs.newTab().setText("CURRENT YEAR"), true);
    allTabs.addTab(allTabs.newTab().setText("2015"));
    allTabs.addTab(allTabs.newTab().setText("2014"));
    allTabs.addTab(allTabs.newTab().setText("2013"));
    allTabs.addTab(allTabs.newTab().setText("2012"));
    allTabs.addTab(allTabs.newTab().setText("2011"));

    //Hide Indicator
    allTabs.setSelectedTabIndicatorColor(getResources().getColor(android.R.color.transparent));
    //Set Custom tab Background
    for (int i = 1; i < allTabs.getTabCount(); i++) {
        TabLayout.Tab tab = allTabs.getTabAt(i);
        RelativeLayout relativeLayout = (RelativeLayout)
                LayoutInflater.from(getActivity()).inflate(R.layout.tab_layout, allTabs, false);
        tvTabText = (TextView) relativeLayout.findViewById(R.id.tab_title);
        View view = (View) relativeLayout.findViewById(R.id.deviderView);

        tvTabText.setText(tab.getText());
        tab.setCustomView(relativeLayout);

        if (i == 0) {
            view.setVisibility(View.GONE);
            tab.select();
        }
    }

}

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="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:gravity="center_horizontal"
        android:padding="10dp"
        android:text="sdasd"
        android:textColor="@drawable/tab_item_selector"
        android:textSize="@dimen/text_size_normal"
        android:textStyle="bold" />

    <!-- Tab divider -->

    <View
        android:id="@+id/deviderView"
        android:layout_width="1dp"
        android:layout_height="wrap_content"
        android:layout_gravity="right"
        android:layout_marginBottom="15dp"
        android:layout_marginTop="15dp"
        android:background="@android:color/white"
        android:gravity="right" />

</RelativeLayout>

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="@android:color/white" />
    <item android:state_focused="true" android:color="@android:color/white" />
    <item android:state_pressed="true" android:color="@android:color/white" />
    <item android:color="#82c6e6" />
</selector>

请始终将其视为可选答案。

【讨论】:

    【解决方案6】:

    试试这个,希望它对你有用。

    tab_activity.xml

    <TabHost
            android:id="@android:id/tabhost"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" >
    
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical" >
    
                <TabWidget
                    android:id="@android:id/tabs"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content" >
                </TabWidget>
    
                <View
                    android:layout_width="match_parent"
                    android:layout_height="2dp"
                    android:background="@color/edt_footer_bg" />
    
                <FrameLayout
                    android:id="@android:id/tabcontent"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:layout_marginTop="15dp"
                    android:background="@android:color/transparent" >
                </FrameLayout>
            </LinearLayout>
        </TabHost>
    

    home_tab.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        xmlns:mytextview="http://schemas.android.com/apk/res/com.bne"
        android:layout_height="50dp"
        android:layout_marginRight="2dp"
        android:background="@color/app_bg_inner"
        android:gravity="center"
        android:padding="10dp" >
    
        <TextView
            android:id="@+id/text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="@drawable/tab_selector"
            android:textSize="@dimen/txt_12"
            mytextview:txt_custom_font="@string/RobotoRegular" />
    
    </LinearLayout>
    

    【讨论】:

      【解决方案7】:

      尝试使用此代码在TabHost 中设置divder mTabHost.getTabWidget().setDividerDrawable(R.Color.blue);

      【讨论】:

      • 问题是针对 TabLayout,而不是 TabHost 或其他东西
      【解决方案8】:

      添加自定义分隔线的一种方法是以编程方式设置它:

      tablayout.getTabWidget().setDividerDrawable(R.drawable.yourdivider image name);
      

      但是,请确保在设置选项卡的内容之前调用它。如果我之后调用它,它会崩溃。

      如果这不起作用,您也可以使用此行

      if(Build.VERSION.SDK_INT >= 11)
          tablayout.getTabWidget().setShowDividers(TabWidget.SHOW_DIVIDER_MIDDLE);
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      • 2015-08-24
      • 2015-10-10
      • 2015-10-19
      相关资源
      最近更新 更多