Ich versuche, das neue Design TabLayout in meinem Projekt zu verwenden. Ich möchte, dass sich das Layout an jede Bildschirmgröße und Ausrichtung anpasst, aber es kann in einer Ausrichtung korrekt angezeigt werden.
Ich habe es mit Schwerkraft und Modus zu tun, indem ich mein tabLayout wie folgt einstelle:
tabLayout.setTabGravity(TabLayout.GRAVITY_CENTER);
tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
Ich gehe davon aus, dass das tabLayout scrollbar ist, wenn kein Platz vorhanden ist. Wenn jedoch Platz vorhanden ist, wird es zentriert.
Aus den Guides:
public static final int GRAVITY_CENTER Schwerkraft, mit der die Registerkarten in der Mitte des TabLayouts angeordnet werden.
public static final int GRAVITY_FILL Die Schwerkraft wird verwendet, um das TabLayout so weit wie möglich zu füllen. Diese Option wird nur wirksam, wenn sie mit MODE_FIXED verwendet wird.
public static final int MODE_FIXED Feste Registerkarten zeigen alle Registerkarten gleichzeitig an und werden am besten mit Inhalten verwendet, die von schnellen Pivots zwischen Registerkarten profitieren. Die maximale Anzahl von Registerkarten ist durch die Breite der Ansicht begrenzt. Feste Registerkarten haben die gleiche Breite, basierend auf der breitesten Registerkartenbezeichnung.
public static final int MODE_SCROLLABLE Bildlaufbare Registerkarten zeigen zu jedem Zeitpunkt eine Teilmenge von Registerkarten an und können längere Registerkartenbezeichnungen und eine größere Anzahl von Registerkarten enthalten. Sie eignen sich am besten zum Durchsuchen von Kontexten in Touch-Oberflächen, wenn Benutzer die Registerkartenbezeichnungen nicht direkt vergleichen müssen.
GRAVITY_FILL ist also nur mit MODE_FIXED kompatibel, aber da für GRAVITY_CENTER nichts angegeben ist, erwarte ich, dass es mit MODE_SCROLLABLE kompatibel ist, aber das bekomme ich mit GRAVITY_CENTER und MODE_SCROLLABLE
Es wird also SCROLLABLE in beiden Ausrichtungen verwendet, jedoch nicht GRAVITY_CENTER.
Das würde ich für die Landschaft erwarten; Aber um dies zu haben, muss ich MODE_FIXED setzen, also bekomme ich im Hochformat:
Warum funktioniert GRAVITY_CENTER nicht für SCROLLABLE, wenn das tabLayout zum Bildschirm passt? Gibt es eine Möglichkeit, die Schwerkraft und den Modus dynamisch einzustellen (und zu sehen, was ich erwarte)?
Vielen Dank!
BEARBEITET: Dies ist das Layout meines 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" />
quelle
Antworten:
Tab Schwerkraft wirkt sich nur aus
MODE_FIXED
.Eine mögliche Lösung ist Ihr gesetzt
layout_width
zuwrap_content
undlayout_gravity
zucenter_horizontal
:Wenn die Registerkarten kleiner als die Bildschirmbreite sind, ist auch die
TabLayout
selbst kleiner und wird aufgrund der Schwerkraft zentriert. Wenn die Registerkarten größer als die Bildschirmbreite sind, entspricht diesTabLayout
der Bildschirmbreite und das Scrollen wird aktiviert.quelle
app:tabMaxWidth="0dp"
undandroid:layout_centerHorizontal="true"
Arbeiten zum Zentrieren von Registerkarten.So habe ich es gemacht
TabLayout.xml
Oncreate
Ich habe kleine Änderungen an der Lösung von @Mario Velasco am ausführbaren Teil vorgenommen
quelle
tabLayout.getWidth()
gibt für mich immer null zurückhält die Dinge einfach einfach App hinzufügen: tabMode = "scrollbar" und android: layout_gravity = "bottom"
genau wie dieser
quelle
Da ich nicht herausgefunden habe, warum dieses Verhalten auftritt, habe ich den folgenden Code verwendet:
Grundsätzlich muss ich die Breite meines tabLayout manuell berechnen und dann den Tab-Modus einstellen, je nachdem, ob das tabLayout in das Gerät passt oder nicht.
Der Grund, warum ich die Größe des Layouts manuell erhalte, ist, dass nicht alle Registerkarten im scrollbaren Modus dieselbe Breite haben. Dies könnte dazu führen, dass einige Namen zwei Zeilen verwenden, wie es mir im Beispiel passiert ist.
quelle
Schauen Sie sich Android-Tablayouthelper
quelle
Dies ist die Lösung, mit der ich automatisch zwischen
SCROLLABLE
undFIXED
+ gewechselt habeFILL
. Dies ist der vollständige Code für die @ Fighter42-Lösung:(Der folgende Code zeigt, wo die Änderung vorgenommen werden muss, wenn Sie die Aktivitätsvorlage mit Registerkarten von Google verwendet haben.)
Layout:
Wenn Sie die Breite nicht füllen müssen, verwenden Sie besser die @ karaokyo-Lösung.
quelle
Ich habe eine AdaptiveTabLayout-Klasse erstellt, um dies zu erreichen. Dies war die einzige Möglichkeit, das Problem tatsächlich zu lösen, die Frage zu beantworten und Probleme zu vermeiden / zu umgehen, die andere Antworten hier nicht haben.
Anmerkungen:
MODE_SCROLLABLE
aber nicht genug Platz vorhanden istMODE_FIXED
. Wenn Sie diesen Fall nicht behandeln, werden auf einigen Geräten unterschiedliche Textgrößen angezeigt, oder es werden zwei Textzeilen in einigen Registerkarten angezeigt, was schlecht aussieht.wrap_content
der XML-Datei angegeben werden. Stellen Sie keinen Modus oder keine Schwerkraft für die XML ein.AdaptiveTabLayout.java
Und das ist die DeviceUtils-Klasse:
Anwendungsbeispiel:
Kern
Probleme / Um Hilfe bitten:
Logcat:
Ich bin nicht sicher, wie ich es lösen soll. Irgendwelche Vorschläge?
quelle
quelle
Dies ist der einzige Code, der für mich funktioniert hat:
Die DisplayMetrics können folgendermaßen abgerufen werden:
Und Ihr TabLayout-XML sollte so aussehen (vergessen Sie nicht, tabMaxWidth auf 0 zu setzen):
quelle
Sie müssen lediglich Folgendes zu Ihrem TabLayout hinzufügen
Dann haben Sie:
quelle
Ich habe das mit folgendem gelöst
quelle
Sehr einfaches Beispiel und es funktioniert immer.
quelle
Meine endgültige Lösung
quelle