web-dev-qa-db-fra.com

Désactiver TabLayout

J'utilise la nouvelle classe fournie par la bibliothèque de conception: TabLayout. Et je veux dans des cas spécifiques que celui que j'utilise ne puisse plus changer d'onglet.

Je parviens à désactiver le balayage sur son viewpager mais je ne vois pas comment désactiver le changement de page en cliquant sur les onglets.

Merci d'avance.

41
MHogge

J'ai eu le même problème et je l'ai résolu en désactivant l'événement tactile sur les onglets avec le code suivant:

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

J'ai trouvé une réponse similaire un peu plus simple et qui vous permet également de réactiver les onglets plus tard si vous le souhaitez sans avoir à gérer l'annulation de l'événement 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);
}

Et si vous souhaitez réactiver les onglets, définissez simplement tabStrip.setEnabled et setClickable pour les éléments enfants sur true.

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

Très similaire à la réponse de pat8719, il ne suffit que de désactiver les onglets pour empêcher leur sélection.

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

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

}
14
grantnz

Un bon truc que vous pouvez utiliser: 

créez une disposition de cadre qui couvre la ou les vues que vous souhaitez protéger contre un clic, comme suit: 

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

Ce code créera une vue vide/transparente en haut de votre vue. L’Android: clickable = "true" va intercepter le clic et empêcher le clic de passer par la vue! 

Ce hack peut probablement être optimisé mais ses quelques lignes de code permettent de protéger plusieurs vues en même temps!

10
Tobliug

Pour moi, l'approche de travail est la suivante:

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

Ceci est sûr à 100%, car getTouchables () call est pris en charge depuis l'API 1. Il n'est pas nécessaire de parcourir manuellement la présentation ou quelque chose du genre. Je considère que c'est beaucoup plus simple que celui de la réponse acceptée, mais seulement lorsque tous les onglets doivent être marqués comme étant non cliquables. 

P.S .: l’exemple est en C #, car je travaille avec Xamarin, mais il est assez facile de le traduire en Java. Prendre plaisir! =)

Exemple Kotlin:

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

Exemple Java:

for (View v: tabLayout.getTouchables())
    v.setClickable(false);
5
Vladislav Rishe

Si vous utilisez une vue personnalisée pour l'onglet, vous pouvez utiliser View # getParent () pour obtenir une référence à la vue de l'onglet si vous ne souhaitez pas parcourir les ViewGroups. 

Remarque: L'utilisation de la vue personnalisée elle-même au lieu du parent risque de ne pas fonctionner, car elle peut comporter une marge, ce qui permet à l'utilisateur de cliquer dans l'espace vide et de modifier l'onglet.

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

La méthode OnTouchListener et la méthode setEnabled () font des choses différentes, mais ont le même effet. Je préfère le one-liner.

Encore une fois, cela ne fonctionne que si vous utilisez une vue personnalisée, sinon l'appel de getParent () provoquera une exception NullPointerException.

4
Jacob Muchow

vérifier ma réponse ici Désactiver les onglets dans TabLayout

Vous pouvez pour onglet boucle et utiliser cette fonction pour désactiver tous les onglets

0
Mạnh Hoàng Huynh