viewpager tablayout developers android disabled-control android-tablayout

android - developers - Deshabilitar TabLayout



view tabs android (6)

Estoy usando la nueva clase proporcionada por la biblioteca de diseño: TabLayout. Y quiero en casos específicos que el que estoy usando ya no puede cambiar de pestaña.

Me las arreglé para desactivar el deslizamiento en su viewpager, pero no puedo encontrar la manera de desactivar el cambio de página haciendo clic en las pestañas.

Gracias por adelantado.


Encontré una respuesta similar que es un poco más simple y también te permite volver a habilitar las pestañas más adelante si lo deseas sin tener que lidiar con anular el evento onTouch.

TabLayout tabLayout = (TabLayout) mParentView.findViewById(R.id.my_tabs); LinearLayout tabStrip = ((LinearLayout)tabLayout.getChildAt(0)); tabStrip.setEnabled(false); for(int i = 0; i < tabStrip.getChildCount(); i++) { tabStrip.getChildAt(i).setClickable(false); }

Y si quiere volver a habilitar las pestañas, simplemente configure tabStrip.setEnabled y setClickable para los elementos secundarios en true

LinearLayout tabStrip = ((LinearLayout)tabLayout.getChildAt(0)); tabStrip.setEnabled(true); for(int i = 0; i < tabStrip.getChildCount(); i++) { tabStrip.getChildAt(i).setClickable(true); }


Muy similar a la respuesta de pat8719, pero basta con deshabilitar las pestañas para evitar que se seleccionen.

TabLayout tabLayout = (TabLayout) mParentView.findViewById(R.id.my_tabs); TabLayoutUtils.enableTabs( tabLayout, false );

Clase TabLayoutUtils

public class TabLayoutUtils { public static void enableTabs(TabLayout tabLayout, Boolean enable){ ViewGroup viewGroup = getTabViewGroup(tabLayout); if (viewGroup != null) for (int childIndex = 0; childIndex < viewGroup.getChildCount(); childIndex++) { View tabView = viewGroup.getChildAt(childIndex); if ( tabView != null) tabView.setEnabled(enable); } } public static View getTabView(TabLayout tabLayout, int position){ View tabView = null; ViewGroup viewGroup = getTabViewGroup(tabLayout); if (viewGroup != null && viewGroup.getChildCount() > position) tabView = viewGroup.getChildAt(position); return tabView; } private static ViewGroup getTabViewGroup(TabLayout tabLayout){ ViewGroup viewGroup = null; if (tabLayout != null && tabLayout.getChildCount() > 0 ) { View view = tabLayout.getChildAt(0); if (view != null && view instanceof ViewGroup) viewGroup = (ViewGroup) view; } return viewGroup; } }


Para mí, el enfoque de trabajo es este:

bool condition = ... foreach (var view in _tabLayout.Touchables) view.Clickable = condition;

Esto es 100% seguro, ya que la llamada getTouchables() es compatible desde la API 1. No es necesario recorrer el diseño manualmente o algo así. Considero que es mucho más simple que el de la respuesta aceptada, pero solo cuando todas las pestañas deben marcarse como no hacer clic.

PD: el ejemplo está en C #, ya que estoy trabajando con Xamarin, pero es bastante fácil traducirlo a Java. ¡Disfrutar! =)

Ejemplo de Kotlin:

tabLayout.touchables.forEach { it.isClickable = false }


Si está utilizando una vista personalizada para la pestaña, puede usar View # getParent () para obtener una referencia a la Vista de la pestaña si no desea ver a través de ViewGroups.

Nota: Es posible que el uso de la vista personalizada en lugar del padre no funcione porque puede tener margen, lo que permite al usuario hacer clic en el espacio vacío y cambiar la pestaña.

View tabView = (View) tab.getCustomView().getParent(); tabView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { return true; } }); //or tabView.setEnabled(false);

El modo OnTouchListener y el modo setEnabled () hacen cosas diferentes, pero tienen el mismo efecto. Prefiero el one-liner.

De nuevo, esto solo funciona si usa una vista personalizada, de lo contrario, la llamada getParent () causará una NullPointerException.


Tuve el mismo problema y lo solucioné deshabilitando el evento táctil en las pestañas con el siguiente código:

LinearLayout tabStrip = ((LinearLayout)mTabLayout.getChildAt(0)); for(int i = 0; i < tabStrip.getChildCount(); i++) { tabStrip.getChildAt(i).setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { return true; } }); }


Un buen truco que puedes usar:

cree un diseño de marco que cubra la vista (s) que desea proteger de un clic como el siguiente:

<FrameLayout android:clickable="true" android:layout_width="match_parent" android:layout_height="match_parent"/>

Este código creará una vista vacía / transparente en la parte superior de su vista. El android: clickable = "true" interceptará el clic y evitará que el clic pase por la vista.

¡Es probable que este truco se pueda optimizar, pero sus pocas líneas de código protegen múltiples vistas al mismo tiempo!