J'essaye d'utiliser le nouveau Design TabLayout dans mon projet. Je veux que la mise en page s'adapte à chaque taille et orientation d'écran, mais elle peut être vue correctement dans une seule orientation.
Je traite avec Gravity and Mode définissant mon tabLayout comme:
tabLayout.setTabGravity(TabLayout.GRAVITY_CENTER);
tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
Je m'attends donc à ce que s'il n'y a pas de place, le tabLayout soit scrollable, mais s'il y a de la place, il est centré.
Des guides:
public static final int GRAVITY_CENTER Gravité utilisée pour disposer les onglets au centre du TabLayout.
public static final int GRAVITY_FILL Gravité utilisée pour remplir le TabLayout autant que possible. Cette option ne prend effet que lorsqu'elle est utilisée avec MODE_FIXED.
public static final int MODE_FIXED Les onglets fixes affichent tous les onglets simultanément et sont mieux utilisés avec du contenu qui bénéficie de pivots rapides entre les onglets. Le nombre maximum d'onglets est limité par la largeur de la vue. Les onglets fixes ont la même largeur, en fonction de l'étiquette d'onglet la plus large.
public static final int MODE_SCROLLABLE Les onglets déroulants affichent un sous-ensemble d'onglets à tout moment et peuvent contenir des étiquettes d'onglets plus longues et un plus grand nombre d'onglets. Ils sont mieux utilisés pour parcourir les contextes dans les interfaces tactiles lorsque les utilisateurs n'ont pas besoin de comparer directement les étiquettes des onglets.
Donc GRAVITY_FILL est compatible uniquement avec MODE_FIXED mais, at ne spécifie rien pour GRAVITY_CENTER, je m'attends à ce qu'il soit compatible avec MODE_SCROLLABLE, mais c'est ce que j'obtiens en utilisant GRAVITY_CENTER et MODE_SCROLLABLE
Donc, il utilise SCROLLABLE dans les deux orientations, mais il n'utilise pas GRAVITY_CENTER.
C'est ce à quoi je m'attendrais pour le paysage; mais pour avoir cela, je dois définir MODE_FIXED, donc ce que j'obtiens en portrait est:
Pourquoi GRAVITY_CENTER ne fonctionne-t-il pas pour SCROLLABLE si le tabLayout correspond à l'écran? Existe-t-il un moyen de définir dynamiquement la gravité et le mode (et de voir ce que j'attends)?
Merci beaucoup!
EDITED: Voici la disposition de mon 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" />
la source
Réponses:
Effets de gravité uniquement
MODE_FIXED
.Une solution possible consiste à définir votre
layout_width
towrap_content
etlayout_gravity
tocenter_horizontal
:Si les onglets sont plus petits que la largeur de l'écran, le
TabLayout
lui - même sera également plus petit et il sera centré à cause de la gravité. Si les onglets sont plus grands que la largeur de l'écran, leTabLayout
correspondra à la largeur de l'écran et le défilement s'activera.la source
app:tabMaxWidth="0dp"
etandroid:layout_centerHorizontal="true"
travail pour centrer les onglets.c'est comme ça que je l'ai fait
TabLayout.xml
Oncreate
J'ai apporté de petits changements à la solution de @Mario Velasco sur la partie exécutable
la source
tabLayout.getWidth()
renvoie toujours zéro pour moisimplifie les choses, ajoutez simplement l'application: tabMode = "scrollable" et android: layout_gravity = "bottom"
juste comme ça
la source
Comme je n'ai pas trouvé pourquoi ce comportement se produit, j'ai utilisé le code suivant:
Fondamentalement, je dois calculer manuellement la largeur de mon tabLayout, puis je règle le mode Tab en fonction de si le tabLayout s'intègre ou non dans l'appareil.
La raison pour laquelle j'obtiens manuellement la taille de la mise en page est que tous les onglets n'ont pas la même largeur en mode Défilement, ce qui pourrait provoquer que certains noms utilisent 2 lignes comme cela m'est arrivé dans l'exemple.
la source
Regardez android-tablayouthelper
la source
C'est la solution que j'ai utilisée pour basculer automatiquement entre
SCROLLABLE
etFIXED
+FILL
. C'est le code complet de la solution @ Fighter42:(Le code ci-dessous montre où placer la modification si vous avez utilisé le modèle d'activité à onglets de Google)
Disposition:
Si vous n'avez pas besoin de remplir la largeur, mieux vaut utiliser la solution @karaokyo.
la source
J'ai créé une classe AdaptiveTabLayout pour y parvenir. C'était le seul moyen que j'ai trouvé pour résoudre le problème, répondre à la question et éviter / contourner les problèmes que les autres réponses ici ne font pas.
Remarques:
MODE_SCROLLABLE
mais pas assez de place pourMODE_FIXED
. Si vous ne gérez pas ce cas, cela se produira sur certains appareils, vous verrez différentes tailles de texte ou afficherez deux lignes de texte dans certains onglets, ce qui semble mauvais.wrap_content
sur le xml. Ne définissez aucun mode ou gravité sur le xml.AdaptiveTabLayout.java
Et voici la classe DeviceUtils:
Utilisez l'exemple:
Essentiel
Problèmes / Demandez de l'aide:
Logcat:
Je ne sais pas comment le résoudre. Aucune suggestion?
la source
la source
C'est le seul code qui a fonctionné pour moi:
Le DisplayMetrics peut être récupéré en utilisant ceci:
Et votre XML TabLayout devrait ressembler à ceci (n'oubliez pas de définir tabMaxWidth sur 0):
la source
Tout ce dont vous avez besoin est d'ajouter ce qui suit à votre TabLayout
Alors vous aurez:
la source
J'ai résolu cela en utilisant
la source
Exemple très simple et ça marche toujours.
la source
Ma solution finale
la source