Estou tentando usar o novo Design TabLayout em meu projeto. Quero que o layout se adapte a todos os tamanhos e orientações de tela, mas ele pode ser visto corretamente em uma orientação.
Estou lidando com Gravidade e Modo definindo meu tabLayout como:
tabLayout.setTabGravity(TabLayout.GRAVITY_CENTER);
tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
Portanto, espero que, se não houver espaço, o tabLayout seja rolável, mas se houver espaço, ele será centralizado.
Dos guias:
public static final int GRAVITY_CENTER Gravidade usada para definir as guias no centro do TabLayout.
public static final int GRAVITY_FILL Gravidade usada para preencher o TabLayout o máximo possível. Esta opção só tem efeito quando usada com MODE_FIXED.
public static final int MODE_FIXED Guias fixas exibem todas as guias simultaneamente e são mais bem usadas com conteúdo que se beneficia de pivôs rápidos entre as guias. O número máximo de guias é limitado pela largura da visualização. As guias fixas têm largura igual, com base no rótulo da guia mais larga.
public static final int MODE_SCROLLABLE As guias roláveis exibem um subconjunto de guias a qualquer momento e podem conter rótulos de guia mais longos e um número maior de guias. Eles são mais usados para contextos de navegação em interfaces de toque quando os usuários não precisam comparar diretamente os rótulos das guias.
GRAVITY_FILL é compatível apenas com MODE_FIXED, mas não especifica nada para GRAVITY_CENTER, espero que seja compatível com MODE_SCROLLABLE, mas é isso que obtenho usando GRAVITY_CENTER e MODE_SCROLLABLE
Então está usando SCROLLABLE nas duas orientações, mas não está usando GRAVITY_CENTER.
Isso é o que eu esperaria da paisagem; mas para ter isso, eu preciso definir MODE_FIXED, então o que obtenho no retrato é:
Por que GRAVITY_CENTER não está funcionando para SCROLLABLE se tabLayout se ajusta à tela? Existe alguma maneira de definir a gravidade e o modo dinamicamente (e para ver o que estou esperando)?
Muito obrigado!
EDITADO: Este é o Layout do meu TabLayout:
<android.support.design.widget.TabLayout
android:id="@+id/sliding_tabs"
android:layout_width="match_parent"
android:background="@color/orange_pager"
android:layout_height="wrap_content" />
fonte
Respostas:
Efeitos da gravidade da guia apenas
MODE_FIXED
.Uma solução possível é definir seu
layout_width
parawrap_content
elayout_gravity
paracenter_horizontal
:Se as guias forem menores do que a largura da tela, o
TabLayout
próprio também será menor e centralizado devido à gravidade. Se as guias forem maiores que a largura da tela, oTabLayout
irá corresponder à largura da tela e a rolagem será ativada.fonte
app:tabMaxWidth="0dp"
eandroid:layout_centerHorizontal="true"
trabalhado para centralizar as guias.foi assim que eu fiz
TabLayout.xml
Oncreate
Fiz pequenas alterações na solução de @Mario Velasco na parte executável
fonte
tabLayout.getWidth()
sempre retorna zero para mimmantém as coisas simples, basta adicionar app: tabMode = "scrollable" e android: layout_gravity = "bottom"
bem assim
fonte
Como não descobri por que esse comportamento acontece, usei o seguinte código:
Basicamente, eu tenho que calcular manualmente a largura do meu tabLayout e então defino o Modo Tab dependendo se o tabLayout cabe no dispositivo ou não.
O motivo pelo qual obtenho o tamanho do layout manualmente é porque nem todas as abas têm a mesma largura no modo Scrollable, e isso pode fazer com que alguns nomes usem 2 linhas, como aconteceu comigo no exemplo.
fonte
Olhe para android-tablayouthelper
fonte
Esta é a solução que usei para mudar automaticamente entre
SCROLLABLE
eFIXED
+FILL
. É o código completo para a solução @ Fighter42:(O código abaixo mostra onde colocar a modificação se você usou o modelo de atividade com guias do Google)
Layout:
Se você não precisa preencher a largura, é melhor usar a solução @karaokyo.
fonte
Criei uma classe AdaptiveTabLayout para fazer isso. Essa foi a única maneira que encontrei de realmente resolver o problema, responder à pergunta e evitar / contornar problemas que outras respostas aqui não conseguem.
Notas:
MODE_SCROLLABLE
mas não há espaço suficiente paraMODE_FIXED
. Se você não cuidar desse caso, isso vai acontecer em alguns dispositivos, você verá tamanhos de texto diferentes ou duas linhas de texto em algumas guias, o que parece ruim.wrap_content
no xml. Não defina nenhum modo ou gravidade no xml.AdaptiveTabLayout.java
E esta é a classe DeviceUtils:
Use o exemplo:
Essência
Problemas / Peça ajuda:
Logcat:
Não tenho certeza de como resolver isso. Alguma sugestão?
fonte
fonte
Este é o único código que funcionou para mim:
O DisplayMetrics pode ser recuperado usando este:
E seu TabLayout XML deve ser semelhante a este (não se esqueça de definir tabMaxWidth como 0):
fonte
Tudo que você precisa é adicionar o seguinte ao seu TabLayout
Então você terá:
fonte
Eu resolvi isso usando o seguinte
fonte
Exemplo muito simples e sempre funciona.
fonte
Minha solução final
fonte