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

我正在使用v7-appcompat库的新的android.support.design.widget.TabLayout ,并发现一个问题,没有办法设置标签之间的分隔线,不知道是否有。

我已经成功地configuration了寻呼机适配器和标签看起来不错,但不能设置标签之间的分隔线。

我想要这种types的选项卡

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

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

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

select标签文本颜色(tab_item_selector.xml)的select器:

 <?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> 

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

默认的标签devise应该按照材料devise规格 。 如果您需要添加分隔线,请考虑使用标签的自定义视图。

检查这个链接 ,你只能控制TabLayout风格的属性而不使用自定义视图

  <style name="Base.Widget.Design.TabLayout" parent="android:Widget"> <item name="tabMaxWidth">@dimen/tab_max_width</item> <item name="tabIndicatorColor">?attr/colorAccent</item> <item name="tabIndicatorHeight">2dp</item> <item name="tabPaddingStart">12dp</item> <item name="tabPaddingEnd">12dp</item> <item name="tabBackground">?attr/selectableItemBackground</item> <item name="tabTextAppearance">@style/TextAppearance.Design.Tab</item> <item name="tabSelectedTextColor">?android:textColorPrimary</item> </style> 

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

1 – 创build正常的标签布局。

2 – 使模式MODE_FIXED

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

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

4 – 使button背景透明。

3 – 通过视图或任意视图在button的水平线性布局布局中添加spertator,并指定宽度为0.5dp或者任何你想要的厚度。

4,你可以在button上添加button,或者将button更改为任何不能处理点击的视图,所以它下面的选项卡将采取点击操作:)。

它可能是丑陋的solutuions,但它的工作完美,做这项工作

另一个提示,如果你想改变选定的选项卡的背景,你可以在tablayout样式中使指标高度等于tablayout的实际高度。

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

试试这个,希望它适合你。

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> 

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

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

设置标签

私人无效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> 

请始终考虑作为可选答案。

我不认为这是可能的,但除非在创buildTab时指定一个customView并添加你的divider, 一个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); 

我希望你能明白我的想法

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

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

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

不过,请确保在设置选项卡的内容之前调用此选项。 如果我之后打电话,它会撞上我的。

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

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