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

Tengo tabs de configuración como ACTUALIZAR 29/05/2015 esta publicación. Las tabs ocupan todo el ancho de mi móvil Nexus 4, pero en la tableta nexus 7 se encuentran en el centro y no cubren el ancho de la pantalla completa.

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

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

  

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

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

  

A partir de este estilo, utilizaremos ” tabGravity ” (los valores posibles son “center” o “fill”) utilizando el valor “fill”.

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

  

Por lo tanto, a partir de este estilo, deberemos reemplazar ” tabMaxWidth “. En mi caso, lo configuré en 0dp , por lo que no tiene límite.

Y mi estilo se veía así:

  

Y luego la barra de tabs llenará toda la pantalla de un lado a otro.

Solución para desplazarse: (TabLayout.MODE_SCROLLABLE), es decir, siempre que necesite más de 2 tabs (tabs dinámicas)

Paso 1: style.xml

    

Paso 2: tu diseño xml

  

Paso 3: en tu Actividad / Fragmento dondequiera que tengas tabs.

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

Para forzar que las tabs ocupen todo el ancho (dividido 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); 

Esto es útil, debes probar

   

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

  

Verifique el código a continuación para encontrar soluciones.

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

  

Tenga en cuenta que para el conteo dynamic de tabs, 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

  

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

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

enter image description here

En mi variante de este problema, tenía 3 tabs de tamaño moderado que no ocupaban todo el ancho en las tabletas. No necesitaba que las tabs se puedan desplazar en las tabletas, ya que las tabletas son lo suficientemente grandes como para mostrar todas las tabs sin necesidad de desplazarse. Pero sí necesitaba que las tabs se puedan desplazar por los teléfonos, ya que los teléfonos son demasiado pequeños para mostrar todas las tabs 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 regular res/layout/main_activity.xml , dejé la app:tabGravity="fill" y app:tabMode="fixed" , y tenía la app:tabMode="scrollable" lugar.