studio programacion móviles libros libro desarrollo desarrollar curso aprende aplicaciones android tabs width appcompat android-appcompat android-tablayout

android - programacion - La pestaña no ocupa todo el ancho en el dispositivo Tablet



manual de programacion android pdf (11)

¿Por qué todo ese trabajo agitado? Simplemente ponga app:tabMode="scrollable" en su TabLayout en XML. Eso es.

He configurado pestañas como ACTUALIZACIÓN 29/05/2015 this publicación. Las pestañas ocupan todo el ancho de mi móvil Nexus 4, pero en la tableta nexus 7 lo colocan en el centro y no cubren el ancho de la pantalla completa.

Captura de pantalla de Nexus 7 Captura de pantalla de Nexus 4


En mi variante de este problema, tenía 3 pestañas de tamaño moderado que no ocupaban todo el ancho en las tabletas. No necesitaba que las pestañas fueran desplazables en tabletas, ya que las tabletas son lo suficientemente grandes como para mostrar las pestañas juntas sin ningún desplazamiento. Pero sí necesitaba que las pestañas fueran desplazables en los teléfonos, ya que los teléfonos son demasiado pequeños para mostrar todas las pestañas juntas.

La mejor solución en mi caso fue agregar un archivo res/layout-sw600dp/main_activity.xml , donde el TabLayout relevante podría tener app:tabGravity="fill" y app:tabMode="fixed" . Pero en mi res/layout/main_activity.xml , res/layout/main_activity.xml app:tabGravity="fill" y app:tabMode="fixed" , y en su lugar tenía app:tabMode="scrollable" .


Esto es útil, debes intentarlo

<android.support.design.widget.TabLayout android:id="@+id/tabs" android:layout_width="match_parent" android:layout_height="wrap_content" app:tabMaxWidth="0dp" app:tabGravity="fill" app:tabMode="fixed" app:tabIndicatorColor="@color/white" app:tabSelectedTextColor="@color/white" app:tabTextColor="@color/orange" />


Para mí, el siguiente código funcionó y fue suficiente.

<android.support.design.widget.TabLayout android:id="@+id/tabs" android:layout_width="match_parent" android:layout_height="wrap_content" app:tabGravity="fill"/>


Para obligar a las pestañas a ocupar todo el ancho (divididas en tamaños iguales), aplique lo siguiente a la vista TabLayout :

TabLayout tabLayout = (TabLayout) findViewById(R.id.your_tab_layout); tabLayout.setTabGravity(TabLayout.GRAVITY_FILL); tabLayout.setTabMode(TabLayout.MODE_FIXED);


Solución para desplazarse: (TabLayout.MODE_SCROLLABLE), es decir, cuando necesite más de 2 pestañas (pestañas dinámicas)

Paso 1: style.xml

<style name="tabCustomStyle" parent="Widget.Design.TabLayout"> <item name="tabGravity">fill</item> <item name="tabMaxWidth">0dp</item> <item name="tabIndicatorColor">#FFFEEFC4</item> <item name="tabIndicatorHeight">2dp</item> <item name="tabTextAppearance">@style/MyCustomTabTextAppearance</item> <item name="tabSelectedTextColor">#FFFEEFC4</item> </style> <style name="MyCustomTabTextAppearance" parent="TextAppearance.Design.Tab"> <item name="android:textSize">@dimen/tab_text_size</item> <item name="android:textAppearance">@style/TextAppearance.roboto_medium</item> <item name="textAllCaps">true</item> </style> <style name="TextAppearance.roboto_medium" parent="android:TextAppearance"> <item name="android:fontFamily">sans-serif-medium</item> </style>

Paso 2: tu diseño xml

<android.support.design.widget.TabLayout android:id="@+id/sliding_tabs" style="@style/tabCustomStyle" android:layout_width="match_parent" android:layout_height="@dimen/tab_strip_height" android:background="@color/your_color" app:tabMode="scrollable" app:tabTextColor="@color/your_color" />

Paso 3: en tu Actividad / Fragmento donde sea que tengas pestañas.

/** * To allow equal width for each tab, while (TabLayout.MODE_SCROLLABLE) */ private void allotEachTabWithEqualWidth() { ViewGroup slidingTabStrip = (ViewGroup) mTabLayout.getChildAt(0); for (int i = 0; i < mTabLayout.getTabCount(); i++) { View tab = slidingTabStrip.getChildAt(i); LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) tab.getLayoutParams(); layoutParams.weight = 1; tab.setLayoutParams(layoutParams); } }


Tuve el mismo problema y verifiqué el estilo TabLayout, y descubrí que su estilo predeterminado es Widget.Design.TabLayout que tiene implementaciones diferentes (normal, horizontal y sw600dp).

El que necesitamos es el de las tabletas (sw600dp) que tiene la siguiente implementación:

<style name="Widget.Design.TabLayout" parent="Base.Widget.Design.TabLayout"> <item name="tabGravity">center</item> <item name="tabMode">fixed</item> </style>

De este estilo usaremos " tabGravity " (cuyos valores posibles son "centro" o "relleno") usando el valor "relleno".

Pero tenemos que profundizar, y luego vemos que este se extiende desde Base.Widget.Design.TabLayout , cuya implementación es:

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

Entonces, a partir de este estilo tendremos que anular " tabMaxWidth ". En mi caso, lo configuré en 0dp , por lo que no tiene límite.

Y mi estilo se veía así:

<style name="MyTabLayout" parent="Widget.Design.TabLayout"> <item name="tabGravity">fill</item> <item name="tabMaxWidth">0dp</item> </style>

Y luego la barra de pestañas llenará toda la pantalla de lado a lado.


Una respuesta "más simple" tomada de Kaizie sería simplemente agregar la app:tabMaxWidth="0dp" en su TabLayout xml:

<android.support.design.widget.TabLayout android:layout_width="match_parent" android:layout_height="wrap_content" app:tabMaxWidth="0dp" app:tabGravity="fill" app:tabMode="fixed" />


Verifique el siguiente código para encontrar soluciones.

A continuación se muestra el código de diseño:

<com.yourpackage.CustomTabLayout android:id="@+id/tabs" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="@color/off_white" app:tabIndicatorColor="@color/primaryColor" app:tabIndicatorHeight="3dp" app:tabMode="scrollable" app:tabPaddingEnd="0dp" app:tabPaddingStart="0dp" />

Tenga en cuenta que para el recuento dinámico de pestañas, no olvide llamar a setTabNumbers (tabcount).

import android.content.Context; import android.support.design.widget.TabLayout; import android.util.AttributeSet; import android.util. import java.lang.reflect.Field; public class CustomTabLayout extends TabLayout { private static final int WIDTH_INDEX = 0; private int DIVIDER_FACTOR = 3; private static final String SCROLLABLE_TAB_MIN_WIDTH = "mScrollableTabMinWidth"; public CustomTabLayout(Context context) { super(context); initTabMinWidth(); } public CustomTabLayout(Context context, AttributeSet attrs) { super(context, attrs); initTabMinWidth(); } public CustomTabLayout(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initTabMinWidth(); } public void setTabNumbers(int num) { this.DIVIDER_FACTOR = num; initTabMinWidth(); } private void initTabMinWidth() { int[] wh = getScreenSize(getContext()); int tabMinWidth = wh[WIDTH_INDEX] / DIVIDER_FACTOR; Log.v("CUSTOM TAB LAYOUT", "SCREEN WIDTH = " + wh[WIDTH_INDEX] + " && tabTotalWidth = " + (tabMinWidth*DIVIDER_FACTOR) + " && TotalTabs = " + DIVIDER_FACTOR); Field field; try { field = TabLayout.class.getDeclaredField(SCROLLABLE_TAB_MIN_WIDTH); field.setAccessible(true); field.set(this, tabMinWidth); } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } private static final int WIDTH_INDEX = 0; private static final int HEIGHT_INDEX = 1; public static int[] getScreenSize(Context context) { int[] widthHeight = new int[2]; widthHeight[WIDTH_INDEX] = 0; widthHeight[HEIGHT_INDEX] = 0; try { WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); Display display = windowManager.getDefaultDisplay(); Point size = new Point(); display.getSize(size); widthHeight[WIDTH_INDEX] = size.x; widthHeight[HEIGHT_INDEX] = size.y; if (!isScreenSizeRetrieved(widthHeight)) { DisplayMetrics metrics = new DisplayMetrics(); display.getMetrics(metrics); widthHeight[0] = metrics.widthPixels; widthHeight[1] = metrics.heightPixels; } // Last defense. Use deprecated API that was introduced in lower than API 13 if (!isScreenSizeRetrieved(widthHeight)) { widthHeight[0] = display.getWidth(); // deprecated widthHeight[1] = display.getHeight(); // deprecated } } catch (Exception e) { e.printStackTrace(); } return widthHeight; } private static boolean isScreenSizeRetrieved(int[] widthHeight) { return widthHeight[WIDTH_INDEX] != 0 && widthHeight[HEIGHT_INDEX] != 0; } }

Referencia tomada de https://medium.com/@elsenovraditya/set-tab-minimum-width-of-scrollable-tablayout-programmatically-8146d6101efe


Solución para desplazable (Kotlin)

En xml:

<com.google.android.material.tabs.TabLayout android:id="@+id/home_tab_layout" android:layout_width="match_parent" android:layout_height="wrap_content" app:tabMaxWidth="0dp" app:tabMode="scrollable" android:fillViewport="true" app:tabGravity="fill" />

En Kotlin:

En mi caso, si tengo menos de 3 pestañas, asigno el mismo espacio.

Nota: Si la condición es según su requisito

if(list.size <= 3){ allotEachTabWithEqualWidth(your_tab_layout) } fun allotEachTabWithEqualWidth(tabLayout: TabLayout) { mTabLayout.tabMode= TabLayout.MODE_FIXED val slidingTabStrip = tabLayout.getChildAt(0) as ViewGroup for (i in 0 until tabLayout.getTabCount()) { val tab = slidingTabStrip.getChildAt(i) val layoutParams = tab.layoutParams as LinearLayout.LayoutParams layoutParams.weight = 1f tab.layoutParams = layoutParams } }


<android.support.design.widget.TabLayout android:layout_width="match_parent" android:layout_height="wrap_content" app:tabMaxWidth="0dp" app:tabGravity="fill" app:tabMode="fixed" />

trabaja para mi. Esto también tiene xmlns:app="http://schemas.android.com/apk/res-auto"