Comment dois-je sélectionner un onglet dans TabLayout par programmation?
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
tabLayout.setupWithViewPager(viewPager);
Comment dois-je sélectionner un onglet dans TabLayout par programmation?
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
tabLayout.setupWithViewPager(viewPager);
Si vous connaissez l'index de l'onglet que vous souhaitez sélectionner, vous pouvez le faire comme suit:
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
TabLayout.Tab tab = tabLayout.getTabAt(someIndex);
tab.select();
Cette technique fonctionne même si vous utilisez TabLayout seul sans ViewPager (ce qui est atypique et probablement une mauvaise pratique, mais je l'ai vu faire).
TabLayout.Tab.select()
: "Sélectionnez cet onglet. Valide uniquement si l'onglet a été ajouté à la barre d'actions."Voici comment je l'ai résolu:
la source
Utilisez ceci:
la source
Objects.requireNonNull(tabs.getTabAt(position)).select();
sûr à utiliserUtilisez ceci:
Après dans OnClickListener:
la source
Ce n'est probablement pas la solution ultime , et cela nécessite que vous utilisiez le
TabLayout
avec unViewPager
, mais voici comment je l'ai résolu:J'ai testé l'ampleur de l'impact sur les performances de l'utilisation de ce code en examinant d'abord les moniteurs de CPU et de mémoire dans Android Studio lors de l'exécution de la méthode, puis en les comparant à la charge qui a été placée sur le CPU et la mémoire lorsque j'ai navigué entre les pages. moi-même (en utilisant des gestes de balayage), et la différence n'est pas significativement grande, donc au moins ce n'est pas une solution horrible ...
J'espère que cela aide quelqu'un!
la source
tabLayout.setScrollPosition(pageIndex,0f,true);
), quand j'ai cliqué sur l'onglet à droite, cela n'a pas mis à jour la page de ViewPager (je ne sais pas pourquoi). Un simple clic sur l'onglet de gauche puis sur l'onglet de droite mettrait enfin à jour la page pour avoir la page de l'onglet de droite, ce qui est très glitch. Mais cette solution n'a eu aucun problème.Si vous ne pouvez pas utiliser tab.select () et que vous ne souhaitez pas utiliser un ViewPager, vous pouvez toujours sélectionner un onglet par programme. Si vous utilisez une vue personnalisée,
TabLayout.Tab setCustomView(android.view.View view)
c'est plus simple. Voici comment procéder dans les deux sens.Si vous n'utilisez pas une vue personnalisée, vous pouvez le faire comme ceci
Utilisez un StateListDrawable pour basculer entre les dessinables sélectionnés et non sélectionnés ou quelque chose de similaire pour faire ce que vous voulez avec les couleurs et / ou les dessinables.
la source
Il suffit de définir
viewPager.setCurrentItem(index)
et le TabLayout associé sélectionnerait l'onglet respectif.la source
Vous pouvez essayer de le résoudre avec ceci:
la source
Un peu en retard mais pourrait être une solution utile. J'utilise ma TabLayout directement dans mon fragment et j'essaie de sélectionner un onglet assez tôt dans le cycle de vie du fragment. Ce qui a fonctionné pour moi, c'est d'attendre que TabLayout ait fini de dessiner ses vues enfant en utilisant la
android.view.View#post
méthode. c'est à dire:la source
new Handler().postDelayed(()->{ tabLayout.post(() -> { tabLayout.getTabAt(myPosition).select(); }); },200);
essaye ça
la source
Je suis utilise TabLayout pour passer des fragments. Cela fonctionne pour la plupart, sauf lorsque j'essaie de sélectionner un onglet par programmation
tab.select()
, monTabLayout.OnTabSelectedListener
déclenche laonTabSelected(TabLayout.Tab tab)
, ce qui me causerait beaucoup de chagrin. Je cherchais un moyen de faire une sélection programmatique sans déclencher l'auditeur.J'ai donc adapté la réponse de @kenodoggy à mon utilisation. J'étais en outre confronté à un problème où certains des objets internes retourneraient nuls (car ils n'étaient pas encore créés, parce que je répondais à
onActivityResult()
partir de mon fragment, ce qui se produit avantonCreate()
dans le cas où l'activité estsingleTask
ousingleInstance
) alors j'ai rédigé un détail si / else séquence qui signalerait l'erreur etNullPointerException
passerait sans que cela ne se déclenche autrement. J'utilise Timber pour la journalisation, si vous n'utilisez pas ce substitut avecLog.e()
.Ici, tabLayout est ma variable de mémoire liée à l'
TabLayout
objet dans mon XML. Et je n'utilise pas la fonction d'onglet de défilement, j'ai donc supprimé cela également.la source
vous devez utiliser un viewPager pour utiliser viewPager.setCurrentItem ()
la source
ajouter pour votre viseur:
// sur le gestionnaire pour éviter les pannes hors de la mémoire
la source
Une solution combinée à partir de différentes réponses est:
la source
Avec le
TabLayout
fourni par la bibliothèque de composants de matériaux utilisez simplement laselectTab
méthode:Il nécessite la version 1.1.0.
la source
Par défaut, si vous sélectionnez un onglet, il sera mis en surbrillance. Si vous souhaitez sélectionner Explicitement signifie utiliser le code commenté donné sous onTabSelected (onglet TabLayout.Tab) avec votre position d'index d'onglet spécifiée. Ce code explique le changement de fragment sur la position sélectionnée de l'onglet à l'aide du viewpager.
la source
Cela peut aussi aider
la source
S'il se trouve que votre onglet par défaut est le premier (0) et que vous passez à un fragment, vous devez remplacer manuellement le fragment pour la première fois. En effet, l'onglet est sélectionné avant que l'auditeur ne soit enregistré.
Alternativement, vous pouvez envisager d'appeler
getTabAt(0).select()
et de remplaceronTabReselected
comme ceci:Cela fonctionnerait car vous remplacez essentiellement le fragment à chaque nouvelle sélection d'onglet.
la source
Vous pouvez définir la position de TabLayout à l'aide des fonctions suivantes
la source
Si vous avez du mal à comprendre, ce code peut vous aider
Vous pouvez également ajouter ceci à votre code:
la source
Essayez de cette façon.
la source
si vous utilisez TabLayout sans viewPager cela aide
la source
Correction de Kotlin
viewPager.currentItem = 0
tabs.setupWithViewPager (viewPager)
la source
cela sélectionnera l'onglet comme page de balayage du téléavertisseur
la source