android androiddesignsupport

android - ¿Cómo establecer el divisor entre pestañas en TabLayout de la biblioteca de soporte de diseño?



androiddesignsupport (8)

Estoy usando el nuevo android.support.design.widget.TabLayout de la biblioteca v7-appcompat , y encontré un problema, no hay forma de establecer el divisor entre las pestañas, no sé si lo hay.

He configurado correctamente el adaptador de buscapersonas y las pestañas se ven bien, pero no puedo establecer el divisor entre las pestañas.

Quiero este tipo de pestañas

Tab1 | Tab2 | Tab3

pero actualmente está mostrando

Tab1 Tab2 Tab3

Mi xml es

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

Estoy agregando pestañas por esto

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


Hay una manera de agregar un divisor mediante el método 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(); }

Diseño personalizado de tabulación con divisor (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>

Establezca el relleno horizontal de la pestaña 0dp en 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" />

Y un selector para el color del texto del título de la pestaña cuando se selecciona (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>


No es la mejor forma alternativa, pero la usé para la corriente

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

Estoy usando fragmentos y hago en onCreate() como

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

Establecer pestaña

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

Considere siempre como una respuesta opcional.


Sin embargo, no creo que sea posible a menos que durante la creación de la pestaña especifique una vista personalizada y agregue su divisor, por ejemplo; un TextView y explícitamente TextView.setCompoundDrawablesWithIntrinsicBounds(0, 0,(int)id_of_a_divider, 0);

como si trataras de detectar si es la primera 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);

espero que entiendas mi idea


Una forma de agregar un divisor personalizado es configurarlo mediante programación:

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

Sin embargo, asegúrese de llamar a esto antes de configurar el contenido de las pestañas. Se estrellaría sobre mí si lo llamara después.

también puedes usar esta línea si esto no funciona

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


hola puedes probar esto como solución a lo que hice de la siguiente manera: -

1-crea tablayout normal.

2-hacer el modo MODE_FIXED

2-agregándolo en framellayout y encima agrega un diseño lineal horizontal.

3-agregue botones en diseño horizontal como el número de sus pestañas y haga que los botones tengan el mismo tamaño layout_wight = 1 para cada botón.

4-haz que el fondo de los botones sea transparente.

3-agregue un spertator entre los botones en el diseño horizontal horizontal de la vista a través de la vista o cualquier vista y especifique el ancho como 0.5dp o el grosor que desee.

4-puede agregar sus clics en los botones o cambiar el botón a cualquier otra vista que no maneje el clic para que la pestaña debajo realice la acción de hacer clic :).

Puede ser una solución fea pero funciona perfectamente y hace el trabajo

otra pista si desea cambiar el fondo de la pestaña seleccionada, puede hacer que la altura del indicador en estilo tablayout sea igual a la altura real de la 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>

y esto es por estilo

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


intente esto, espero que funcione bien para usted.

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>


intente usar este código para establecer el divder en TabHost mTabHost.getTabWidget().setDividerDrawable(R.Color.blue);


TabLayout es en realidad HorizontalScrollView y su primer hijo es LinearLayout .

Así que solo use el código a continuación para agregar divisores

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

A continuación se muestra la captura de pantalla de muestra

Pantalla 1

Pantalla 2