Jak powinienem wybrać kartę w TabLayout programowo?
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
tabLayout.setupWithViewPager(viewPager);
Jak powinienem wybrać kartę w TabLayout programowo?
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
tabLayout.setupWithViewPager(viewPager);
Jeśli znasz indeks karty, którą chcesz wybrać, możesz to zrobić w następujący sposób:
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
TabLayout.Tab tab = tabLayout.getTabAt(someIndex);
tab.select();
Ta technika działa nawet wtedy, gdy używasz TabLayout samodzielnie bez ViewPager (co jest nietypowe i prawdopodobnie złe praktyki, ale widziałem, że to zrobione).
TabLayout.Tab.select()
: „Wybierz tę kartę. Ważne tylko, jeśli karta została dodana do paska akcji”.Oto jak to rozwiązałem:
źródło
Użyj tego:
źródło
Objects.requireNonNull(tabs.getTabAt(position)).select();
bezpieczny w użyciuUżyj tego:
Po w OnClickListener:
źródło
Prawdopodobnie nie jest to najlepsze rozwiązanie i wymaga użycia
TabLayout
razem zViewPager
, ale tak to rozwiązałem:Testowałem, jak duży wpływ na wydajność ma użycie tego kodu, najpierw patrząc na monitory procesora i pamięci w Android Studio podczas uruchamiania metody, a następnie porównując go z obciążeniem procesora i pamięci podczas nawigacji między stronami ja (używając gestów machnięcia), a różnica nie jest znacząco duża, więc przynajmniej nie jest to okropne rozwiązanie ...
Mam nadzieję, że to komuś pomoże!
źródło
tabLayout.setScrollPosition(pageIndex,0f,true);
), kiedy kliknąłem kartę po prawej stronie, nie zaktualizowałem strony ViewPager (nie wiem dlaczego). Tylko ponowne kliknięcie lewej karty, a następnie ponownie prawej karty, w końcu zaktualizuje stronę, tak aby strona prawej karty była bardzo błędna. Ale to rozwiązanie nie miało żadnych problemów.Jeśli nie możesz użyć tab.select () i nie chcesz używać ViewPager, nadal możesz programowo wybrać kartę. Jeśli korzystasz z niestandardowego widoku,
TabLayout.Tab setCustomView(android.view.View view)
jest to prostsze. Oto jak to zrobić na dwa sposoby.Jeśli nie używasz widoku niestandardowego, możesz to zrobić w ten sposób
Użyj StateListDrawable, aby przełączać między wybranymi i niezaznaczonymi rysunkami lub coś podobnego, aby robić to, co chcesz z kolorami i / lub rysunkami.
źródło
Po prostu ustaw
viewPager.setCurrentItem(index)
i powiązany TabLayout wybierze odpowiednią kartę.źródło
Możesz spróbować rozwiązać to w ten sposób:
źródło
Spróbuj tego
źródło
Trochę za późno, ale może być przydatnym rozwiązaniem. Korzystam z TabLayout bezpośrednio w moim fragmencie i staram się wybrać kartę dość wcześnie w cyklu życia fragmentu. To, co działało dla mnie, to czekać, aż TabLayout zakończy rysowanie widoków potomnych przy użyciu
android.view.View#post
metody. to znaczy:źródło
new Handler().postDelayed(()->{ tabLayout.post(() -> { tabLayout.getTabAt(myPosition).select(); }); },200);
Ja jestem za pomocą TabLayout przełączyć fragmenty. Działa w przeważającej części, z wyjątkiem przypadków, gdy próbowałem programowo wybrać kartę za pomocą
tab.select()
, mójTabLayout.OnTabSelectedListener
wyzwalałbyonTabSelected(TabLayout.Tab tab)
, co wywołałoby u mnie wielki smutek. Szukałem sposobu na dokonanie wyboru programowego bez uruchamiania odbiornika.Dostosowałem więc odpowiedź @kenodoggy do mojego zastosowania. Miałem też problem z tym, że niektóre wewnętrzne obiekty zwróciłyby wartość null (ponieważ nie zostały jeszcze utworzone, ponieważ odpowiadałem
onActivityResult()
z mojego fragmentu, co występuje wcześniejonCreate()
w przypadku, gdy działanie jestsingleTask
lubsingleInstance
), więc napisałem szczegółowe, jeśli / else sekwencja, która zgłosi błąd i przejdzie bez tegoNullPointerException
, co w przeciwnym razie uruchomiłoby się. Używam Timber do logowania, jeśli nie używasz tego zamiennika zLog.e()
.TabLayout jest tutaj moją zmienną pamięci związaną z
TabLayout
obiektem w moim pliku XML. I nie używam funkcji przewijania, więc też ją usunąłem.źródło
powinieneś użyć viewPager, aby użyć viewPager.setCurrentItem ()
źródło
dodaj do przeglądarki:
// na module obsługi, aby zapobiec awarii pamięci
źródło
Połączone rozwiązanie z różnych odpowiedzi to:
źródło
Z
TabLayout
dostarczonej przez bibliotekę komponentów materiałów wystarczy użyćselectTab
metody:Wymaga wersji 1.1.0.
źródło
Domyślnie, jeśli wybierzesz kartę, zostanie ona podświetlona. Jeśli chcesz wybrać Jawnie, oznacza to, że użyj podanego w komentarzu kodu w polu onTabSelected (tabLayout.Tab) z określoną pozycją indeksu tabulatorów. Ten kod objaśnia zmiany fragmentu na wybranej pozycji zakładki za pomocą przeglądarki.
źródło
To też może pomóc
źródło
Jeśli tak się stanie, że domyślna karta jest pierwsza (0) i zdarzy się, że przełączysz się na fragment, musisz ręcznie zastąpić fragment po raz pierwszy. Jest tak, ponieważ karta jest wybierana przed zarejestrowaniem się nasłuchiwacza.
Alternatywnie możesz rozważyć wywołanie
getTabAt(0).select()
i zastąpienie w następującyonTabReselected
sposób:To działałoby, ponieważ zasadniczo zamieniasz fragment przy każdej ponownej selekcji karty.
źródło
Możesz ustawić pozycję TabLayout za pomocą następujących funkcji
źródło
Jeśli masz problemy ze zrozumieniem, ten kod może ci pomóc
Możesz również dodać to do swojego kodu:
źródło
Wypróbuj w ten sposób
źródło
jeśli używasz TabLayout bez viewPager, to pomaga
źródło
Poprawka Kotlin
viewPager.currentItem = 0
tabs.setupWithViewPager (viewPager)
źródło
spowoduje to wybranie zakładki jako strony przesuwania strony pager
źródło