Como devo selecionar uma guia no TabLayout programaticamente?
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
tabLayout.setupWithViewPager(viewPager);
Como devo selecionar uma guia no TabLayout programaticamente?
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
tabLayout.setupWithViewPager(viewPager);
Se você conhece o índice da guia que deseja selecionar, pode fazê-lo da seguinte maneira:
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
TabLayout.Tab tab = tabLayout.getTabAt(someIndex);
tab.select();
Essa técnica funciona mesmo se você estiver usando o TabLayout por si só sem um ViewPager (que é uma prática atípica e provavelmente ruim, mas eu já vi isso).
TabLayout.Tab.select()
: "Selecione esta guia. Válido apenas se a guia tiver sido adicionada à barra de ação."Foi assim que eu resolvi:
fonte
Usa isto:
fonte
Objects.requireNonNull(tabs.getTabAt(position)).select();
seguroUsa isto:
Depois no OnClickListener:
fonte
Provavelmente, essa não é a solução definitiva e requer que você use a
TabLayout
junto com aViewPager
, mas foi assim que eu a resolvi:Testei o tamanho do impacto no desempenho do uso desse código, observando primeiro os monitores de CPU e memória no Android Studio enquanto executava o método, depois comparando-o com a carga que foi colocada na CPU e na memória quando navegava pelas páginas eu (usando gestos de furto), e a diferença não é significativamente grande, então pelo menos não é uma solução horrível ...
Espero que isso ajude alguém!
fonte
tabLayout.setScrollPosition(pageIndex,0f,true);
), quando cliquei na guia à direita, ela não atualizou a página do ViewPager (não sei por que). Se você clicar novamente na guia esquerda e depois na guia direita novamente, finalmente atualizará a página para ter a página da guia direita, o que é muito complicado. Mas essa solução não teve falhas.Se você não pode usar tab.select () e não deseja usar um ViewPager, ainda pode selecionar uma guia por meio de programação. Se você estiver usando uma exibição personalizada
TabLayout.Tab setCustomView(android.view.View view)
, é mais simples. Veja como fazer isso nos dois sentidos.Se você não estiver usando uma exibição personalizada, poderá fazê-lo assim
Use um StateListDrawable para alternar entre drawables selecionados e não selecionados ou algo semelhante para fazer o que você quer com cores e / ou drawables.
fonte
Basta definir
viewPager.setCurrentItem(index)
e o TabLayout associado selecionaria a guia respectiva.fonte
Você pode tentar resolvê-lo com isso:
fonte
tente isso
fonte
Um pouco tarde, mas pode ser uma solução útil. Estou usando meu TabLayout diretamente no meu fragmento e tentando selecionar uma guia bem cedo no ciclo de vida do fragmento. O que funcionou para mim foi esperar até que o TabLayout terminasse de desenhar suas visualizações filho usando o
android.view.View#post
método ou seja:fonte
new Handler().postDelayed(()->{ tabLayout.post(() -> { tabLayout.getTabAt(myPosition).select(); }); },200);
Eu estou usando TabLayout para mudar fragmentos. Ele funciona na maior parte do tempo, exceto quando eu tentava selecionar uma guia usando programaticamente
tab.select()
, o meuTabLayout.OnTabSelectedListener
acionava oonTabSelected(TabLayout.Tab tab)
, o que me causava muita dor. Eu estava procurando uma maneira de fazer a seleção programática sem acionar o ouvinte.Então adaptei a resposta de @kenodoggy ao meu uso. Eu ainda estava enfrentando um problema em que alguns dos objetos internos retornariam nulos (porque ainda não foram criados, porque eu estava respondendo
onActivityResult()
do meu fragmento, o que ocorre antesonCreate()
no caso em que a atividade ésingleTask
ousingleInstance
) e, por isso, escrevi um / else sequência que informaria o erro e falharia sem aNullPointerException
que seria acionada. Eu uso a madeira para registrar, se você não estiver usando esse substituto comLog.e()
.Aqui, tabLayout é a minha variável de memória vinculada ao
TabLayout
objeto no meu XML. E como não uso o recurso da guia de rolagem, removi-o também.fonte
você deve usar um viewPager para usar o viewPager.setCurrentItem ()
fonte
adicione para o seu viewpager:
// no manipulador para evitar falhas de memória
fonte
Uma solução combinada de respostas diferentes é:
fonte
Com o
TabLayout
fornecido pela Biblioteca de componentes de materiais, basta usar oselectTab
método:Requer a versão 1.1.0.
fonte
Por padrão, se você selecionar uma guia, ela será destacada. Se você deseja selecionar Explicitamente, use o código comentado fornecido em onTabSelected (guia TabLayout.Tab) com a posição do índice da guia especificada. Este código explica como alterar o fragmento na posição selecionada na guia usando o viewpager.
fonte
Isso também pode ajudar
fonte
Se a sua guia padrão for a primeira (0) e você mudar para um fragmento, substitua-o manualmente pela primeira vez. Isso ocorre porque a guia é selecionada antes que o ouvinte seja registrado.
Como alternativa, você pode considerar chamar
getTabAt(0).select()
e substituir da seguinteonTabReselected
maneira:Isso funcionaria porque você está substituindo essencialmente o fragmento em todas as guias selecionadas novamente.
fonte
Você pode definir a posição TabLayout usando as seguintes funções
fonte
Se você tiver problemas para entender, esse código pode ajudá-lo
Você também pode adicionar isso ao seu código:
fonte
Tente assim.
fonte
se você estiver usando o TabLayout sem o viewPager, isso ajudará
fonte
Kotlin fix
viewPager.currentItem = 0
tabs.setupWithViewPager (viewPager)
fonte
isso selecionará a guia como visualizar a página de furto do pager
fonte