Wie soll ich programmgesteuert eine Registerkarte in TabLayout auswählen?
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
tabLayout.setupWithViewPager(viewPager);
Wie soll ich programmgesteuert eine Registerkarte in TabLayout auswählen?
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
tabLayout.setupWithViewPager(viewPager);
Wenn Sie den Index der Registerkarte kennen, die Sie auswählen möchten, können Sie dies folgendermaßen tun:
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
TabLayout.Tab tab = tabLayout.getTabAt(someIndex);
tab.select();
Diese Technik funktioniert auch dann, wenn Sie das TabLayout alleine ohne ViewPager verwenden (was untypisch ist und wahrscheinlich eine schlechte Praxis ist, aber ich habe es gesehen).
TabLayout.Tab.select()
: "Wählen Sie diese Registerkarte. Nur gültig, wenn die Registerkarte zur Aktionsleiste hinzugefügt wurde."So habe ich es gelöst:
quelle
Benutze das:
quelle
Objects.requireNonNull(tabs.getTabAt(position)).select();
sicher zu bedienenBenutze das:
Nach in OnClickListener:
quelle
Dies ist wahrscheinlich nicht die ultimative Lösung , und es erfordert, dass Sie die
TabLayout
zusammen mit a verwendenViewPager
, aber so habe ich es gelöst:Ich habe getestet, wie groß die Auswirkungen der Verwendung dieses Codes auf die Leistung sind, indem ich zuerst die CPU- und Speichermonitore in Android Studio betrachtete, während ich die Methode ausführte, und sie dann mit der Last verglich, die der CPU und dem Speicher beim Navigieren zwischen den Seiten auferlegt wurde Ich selbst (mit Wischgesten), und der Unterschied ist nicht wesentlich, also ist es zumindest keine schreckliche Lösung ...
Hoffe das hilft jemandem!
quelle
tabLayout.setScrollPosition(pageIndex,0f,true);
) ausgeführt habe und auf die Registerkarte rechts geklickt habe, wurde die Seite des ViewPager nicht aktualisiert (ich weiß nicht warum). Wenn Sie nur auf die linke Registerkarte und dann wieder auf die rechte Registerkarte klicken, wird die Seite endgültig aktualisiert, sodass die Seite der rechten Registerkarte angezeigt wird, was sehr problematisch ist. Aber diese Lösung hatte keine Störungen.Wenn Sie tab.select () nicht verwenden können und keinen ViewPager verwenden möchten, können Sie dennoch programmgesteuert eine Registerkarte auswählen. Wenn Sie eine benutzerdefinierte Ansicht verwenden
TabLayout.Tab setCustomView(android.view.View view)
, ist dies einfacher. So geht's in beide Richtungen.Wenn Sie keine benutzerdefinierte Ansicht verwenden, können Sie dies folgendermaßen tun
Verwenden Sie eine StateListDrawable, um zwischen ausgewählten und nicht ausgewählten Zeichenelementen oder Ähnlichem umzuschalten und mit Farben und / oder Zeichenelementen das zu tun, was Sie möchten.
quelle
Einfach einstellen
viewPager.setCurrentItem(index)
und das zugehörige TabLayout würde die entsprechende Registerkarte auswählen.quelle
Sie können versuchen, es damit zu lösen:
quelle
Versuche dies
quelle
Ein bisschen spät, könnte aber eine nützliche Lösung sein. Ich verwende mein TabLayout direkt in meinem Fragment und versuche, einen Tab ziemlich früh im Lebenszyklus des Fragments auszuwählen. Was für mich funktioniert hat, war zu warten, bis das TabLayout seine untergeordneten Ansichten mithilfe der
android.view.View#post
Methode gezeichnet hat . dh:quelle
new Handler().postDelayed(()->{ tabLayout.post(() -> { tabLayout.getTabAt(myPosition).select(); }); },200);
Ich bin mit TabLayout Fragmente zu wechseln. Es funktioniert größtenteils, außer wenn ich versucht habe, programmgesteuert eine Registerkarte auszuwählen
tab.select()
, hat myTabLayout.OnTabSelectedListener
das ausgelöstonTabSelected(TabLayout.Tab tab)
, was mir viel Kummer bereitet. Ich suchte nach einer Möglichkeit, eine programmatische Auswahl zu treffen, ohne den Hörer auszulösen.Also habe ich die Antwort von @kenodoggy an meine Verwendung angepasst. Ich hatte weiterhin ein Problem, bei dem einige der internen Objekte null zurückgaben (weil sie noch nicht erstellt wurden, weil ich
onActivityResult()
von meinem Fragment aus geantwortet habe, was zuvoronCreate()
bei der AktivitätsingleTask
oder der Fall warsingleInstance
), also schrieb ich ein detailliertes if auf / else Sequenz, die den Fehler meldet und durchfällt, ohneNullPointerException
dass dies sonst ausgelöst würde. Ich verwende Timber für die Protokollierung, wenn Sie diesen Ersatz nicht mit verwendenLog.e()
.Hier ist tabLayout meine Speichervariable, die an das
TabLayout
Objekt in meinem XML gebunden ist . Und ich verwende die Funktion zum Scrollen nicht, also habe ich sie auch entfernt.quelle
Sie sollten einen viewPager verwenden, um viewPager.setCurrentItem () zu verwenden.
quelle
Fügen Sie für Ihren Viewpager hinzu:
// auf dem Handler, um einen Absturz des Speichers zu verhindern
quelle
Eine kombinierte Lösung aus verschiedenen Antworten lautet:
quelle
Verwenden Sie mit der
TabLayout
von der Material Components Library bereitgestelltenselectTab
Methode einfach die folgende Methode:Es erfordert Version 1.1.0.
quelle
Wenn Sie eine Registerkarte auswählen, wird diese standardmäßig hervorgehoben. Wenn Sie explizit auswählen möchten, verwenden Sie den angegebenen kommentierten Code unter onTabSelected (Registerkarte TabLayout.Tab) mit der angegebenen Tab-Indexposition. In diesem Code wird das Ändern des Fragments an der auf der Registerkarte ausgewählten Position mithilfe des Viewpagers erläutert.
quelle
Das kann auch helfen
quelle
Wenn Ihre Standardregisterkarte die erste ist (0) und Sie zufällig zu einem Fragment wechseln, müssen Sie das Fragment zum ersten Mal manuell ersetzen. Dies liegt daran, dass die Registerkarte ausgewählt wird, bevor der Listener registriert wird.
Alternativ können Sie das Aufrufen
getTabAt(0).select()
und Überschreiben folgendermaßen in Betracht ziehenonTabReselected
:Dies würde funktionieren, da Sie das Fragment im Wesentlichen bei jeder erneuten Auswahl der Registerkarte ersetzen.
quelle
Sie können die TabLayout-Position mit den folgenden Funktionen festlegen
quelle
Wenn Sie Probleme beim Verstehen haben, kann Ihnen dieser Code helfen
Sie können dies auch zu Ihrem Code hinzufügen:
quelle
Versuchen Sie es auf diese Weise.
quelle
Wenn Sie TabLayout ohne viewPager verwenden, hilft dies
quelle
Kotlin reparieren
viewPager.currentItem = 0
tabs.setupWithViewPager (viewPager)
quelle
Dadurch wird die Registerkarte als Seite zum Anzeigen des Pager-Swipe ausgewählt
quelle