Soutien Android Design TabLayout: Centre de Gravité et le Mode de Défilement
Je suis en train d'utiliser le nouveau Design TabLayout dans mon projet. Je veux que la mise en page pour s'adapter à toute taille de l'écran et de l'orientation, mais il peut être vu correctement en une seule orientation.
Je fais affaire avec la Gravité et le Mode de réglage de mes tabLayout comme:
tabLayout.setTabGravity(TabLayout.GRAVITY_CENTER);
tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
Donc je pense que si il n'y a pas de place, la tabLayout est scrollable, mais si il ya de la place, il est centré.
Par les guides:
public static final int GRAVITY_CENTER Gravité utilisé pour établir le
les onglets dans le centre de la TabLayout.public static final int GRAVITY_FILL Gravité utilisé pour remplir l'
TabLayout autant que possible. Cette option ne prend effet que lorsque utilisé
avec MODE_FIXED.public static final int MODE_FIXED Fixe onglets afficher tous les onglets
en même temps et sont mieux utilisés avec un contenu qui bénéficie rapide
pivots entre les onglets. Le nombre maximum d'onglets est limitée par la
vue de la largeur. Fixe les onglets ont la même largeur, basée sur la plus grande onglet
label.public static final int MODE_SCROLLABLE Défilement d'affichage des onglets d'un
sous-ensemble d'onglets, à un moment donné, et peut contenir plus de l'onglet étiquettes
et un plus grand nombre d'onglets. Ils sont les mieux utilisé pour l'exploration des contextes
dans les interfaces tactiles, lorsque les utilisateurs n'ont pas besoin de comparer directement l'onglet
les étiquettes.
Donc GRAVITY_FILL est compatible uniquement avec les MODE_FIXED mais, à ne pas spécifier quoi que ce soit pour GRAVITY_CENTER, j'attends qu'il soit compatible avec MODE_SCROLLABLE, mais c'est ce que je obtenir de l'aide GRAVITY_CENTER et MODE_SCROLLABLE
C'est donc à l'aide de DÉFILEMENT dans les deux orientations, mais il n'est pas à l'aide de GRAVITY_CENTER.
C'est ce que j'attends pour les paysages, mais à avoir de cela, j'ai besoin de MODE_FIXED, donc ce que je reçois dans le portrait:
Pourquoi est GRAVITY_CENTER ne travaillant pas pour le DÉFILEMENT si le tabLayout s'adapte à l'écran?
Est-il possible de définir la gravité et de la mode de manière dynamique (et voir ce que je suis dans l'attente d')?
Merci beaucoup!
ÉDITÉ: C'est la Mise en page 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" />
- avez-vous trouvé une solution à cela? Je suis confronté au même problème.
- La seule façon que j'ai trouvée a été d'obtenir la taille de vos onglets (manuellement), puis configurer les paramètres de mise en page dinamically selon s'il convient ou non.
- pouvez-vous poster un exemple de code pour la solution que vous utilisez?
- Je sais que ma réponse n'est pas bon pour la logique, mais il m'aide. Mettre des espaces avant et après le texte. Ensuite, il sera déplacé. dans les deux modes.
Vous devez vous connecter pour publier un commentaire.
Onglet uniquement sur la gravité des effets
MODE_FIXED
.Une solution possible est de mettre votre
layout_width
àwrap_content
etlayout_gravity
àcenter_horizontal
:Si les onglets sont plus petits que la largeur de l'écran, la
TabLayout
lui-même sera aussi plus petit et il sera centré en raison de la gravité. Si les onglets sont plus grandes que la largeur de l'écran, laTabLayout
va correspondre à la largeur de l'écran de défilement et l'activer.app:tabMaxWidth="0dp"
etandroid:layout_centerHorizontal="true"
travaillé pour le centre d'onglets.c'est la façon dont je l'ai fait
TabLayout.xml
Oncreate
J'ai fait des petits changements de @Mario Velasco de la solution sur le praticable de la partie
tabLayout.getWidth()
renvoie toujours zéro pour moiQue je n'ai pas trouver pourquoi ce comportement arriver, j'ai utilisé le code suivant:
En gros, je dois calculer manuellement la largeur de mon tabLayout et puis j'ai mis l'Onglet Mode selon si le tabLayout s'insère dans l'appareil ou pas.
La raison pour laquelle je obtenir la taille de la mise en page manuellement parce que tous les onglets ont la même largeur en mode de Défilement, ce qui pourrait provoquer que certains noms d'utiliser 2 lignes comme ça m'est arrivé dans l'exemple.
Regarder android-tablayouthelper
garde les choses simples, juste ajouter app:tabMode="scrollable"
et android:layout_gravity= "bottom"
tout comme ce
C'est la solution que j'ai utilisé pour changer automatiquement entre les
SCROLLABLE
etFIXED
+FILL
. C'est le code complet pour le @Fighter42 solution:(Le code ci-dessous montre l'endroit où placer la modification, si vous avez utilisé Google onglets activité de modèle)
Mise en page:
Si vous n'avez pas besoin de remplir la largeur, de mieux utiliser @karaokyo solution.
J'ai créé un AdaptiveTabLayout classe pour atteindre cet objectif. C'était le seul moyen que j'ai trouvé pour réellement résoudre le problème, répondez à la question et d'éviter/contourner des problèmes que d'autres réponses ici ne sont pas.
Notes:
chambre pour
MODE_SCROLLABLE
mais pas assez de place pourMODE_FIXED
. Sivous n'avez pas à traiter ce cas, il va se produire sur certains appareils, vous aurez
voir les différentes tailles de texte ou un four à deux lignes de texte dans des onglets, ce qui
est de mauvaise qualité.
éviter du travail supplémentaire.
wrap_content
sur le xml. Ne définissez pas de n'importe quel mode ou de la gravité sur le xml.AdaptiveTabLayout.java
Et c'est le DeviceUtils classe:
Exemple d'utilisation:
Gist
Problèmes/Demander de l'aide:
Logcat:
Je ne suis pas sûr de la façon de le résoudre. Des suggestions?
Cela peut entraîner des problèmes avec davantage d'aide à la Conception de la Bibliothèque de mises à jour. Une meilleure approche/suggestions?
C'est le seul code qui a fonctionné pour moi:
La DisplayMetrics peuvent être récupérées en utilisant ce:
Et votre TabLayout XML devrait ressembler à ceci (n'oubliez pas de mettre tabMaxWidth 0):
Tous vous avez besoin est d'ajouter les éléments suivants à votre TabLayout
Alors vous aurez:
J'ai résolu ce problème en utilisant la suite
Exemple très simple et il fonctionne toujours.
Ma solution finale