BottomNavigationView zeigt keine inaktiven Menütitel an.
Wie werden Titel aller Menüelemente in der bottomNavigationBar angezeigt? Das Problem ist, dass in meinem Fall nur der Titel des angeklickten Elements angezeigt wird.
BottomNavigationView zeigt keine inaktiven Menütitel an.
Wie werden Titel aller Menüelemente in der bottomNavigationBar angezeigt? Das Problem ist, dass in meinem Fall nur der Titel des angeklickten Elements angezeigt wird.
Antworten:
Implementierung von BottomNavigationView
has Bedingung: Wenn mehr als 3 Elemente vorhanden sind, verwenden Sie den Shift-Modus.
Derzeit können Sie es nicht über die vorhandene API ändern. Die einzige Möglichkeit, den Shift-Modus zu deaktivieren, besteht in der Verwendung von Reflection.
Sie benötigen eine Hilfsklasse:
import android.support.design.internal.BottomNavigationItemView;
import android.support.design.internal.BottomNavigationMenuView;
import android.support.design.widget.BottomNavigationView;
import android.util.Log;
import java.lang.reflect.Field;
public class BottomNavigationViewHelper {
public static void disableShiftMode(BottomNavigationView view) {
BottomNavigationMenuView menuView = (BottomNavigationMenuView) view.getChildAt(0);
try {
Field shiftingMode = menuView.getClass().getDeclaredField("mShiftingMode");
shiftingMode.setAccessible(true);
shiftingMode.setBoolean(menuView, false);
shiftingMode.setAccessible(false);
for (int i = 0; i < menuView.getChildCount(); i++) {
BottomNavigationItemView item = (BottomNavigationItemView) menuView.getChildAt(i);
//noinspection RestrictedApi
item.setShiftingMode(false);
// set once again checked value, so view will be updated
//noinspection RestrictedApi
item.setChecked(item.getItemData().isChecked());
}
} catch (NoSuchFieldException e) {
Log.e("BNVHelper", "Unable to get shift mode field", e);
} catch (IllegalAccessException e) {
Log.e("BNVHelper", "Unable to change value of shift mode", e);
}
}
}
Wenden Sie dann die disableShiftMode
Methode auf Ihren BottomNavigationView
Code an. Denken Sie jedoch daran, dass Sie die Menüansicht nach dem Aufblasen ausführen müssen, wenn Sie sie in Ihrem Code aufblasen.
Anwendungsbeispiel:
BottomNavigationView bottomNavigationView = (BottomNavigationView) findViewById(R.id.bottom_navigation_bar);
BottomNavigationViewHelper.disableShiftMode(bottomNavigationView);
PS.
Denken Sie daran, dass Sie diese Methode jedes Mal ausführen müssen, wenn Sie Menüelemente in Ihrem Menü ändern BottomNavigationView
.
AKTUALISIEREN
Sie müssen auch die Proguard-Konfigurationsdatei (z. B. proguard-rules.pro) aktualisieren. Der obige Code verwendet Reflection und funktioniert nicht, wenn Proguard das mShiftingMode
Feld verschleiert .
-keepclassmembers class android.support.design.internal.BottomNavigationMenuView {
boolean mShiftingMode;
}
Vielen Dank an Muhammad Alfaifi, der auf dieses Problem hingewiesen und einen Ausschnitt bereitgestellt hat .
UPDATE 2
Wie Jolanda Verhoef betonte, bietet die neue Support-Bibliothek ( 28.0.0-alpha1
) und auch die neue Material Components-Bibliothek ( 1.0.0-beta01
) eine öffentliche Eigenschaft, mit der der Verschiebemodus über 3 Menüelemente bearbeitet werden kann.
<com.google.android.material.bottomnavigation.BottomNavigationView
...
app:labelVisibilityMode="labeled"
...
/>
In der Materialkomponentenbibliothek gilt dies auch, wenn 5 Menüpunkte vorhanden sind.
UPDATE 3
Wie auch @ThomasSunderland hervorhob, können Sie diese Eigenschaft app:itemHorizontalTranslation="false"
ohne Enabled
Postfix auf false setzen , um die Verschiebungsanimation zu deaktivieren.
Die vollständige Anleitung zum Stylen der BottomNavigation finden Sie hier
Seit der Unterstützungsbibliothek 28.0.0-alpha1:
<android.support.design.widget.BottomNavigationView
app:labelVisibilityMode="labeled" />
app:
nicht verwendenandroid:
Um die Textanimation zu deaktivieren, können Sie dies auch in Ihrer Datei dimensions.xml verwenden:
<dimen name="design_bottom_navigation_active_text_size">12sp</dimen>
Möglicherweise müssen Sie dies auch in Ihr Manifest aufnehmen:
tools:override="true"
tools:override="true"
<dimen name="design_bottom_navigation_active_text_size" tools:ignore="PrivateResource">12sp</dimen>
Sie können jetzt app:labelVisibilityMode="[labeled, unlabeled, selected, auto]"
in verwenden28-alpha
labeled
hält alle Beschriftungen sichtbar.unlabeled
zeigt nur Symbole an.selected
zeigt nur die Beschriftung für das ausgewählte Element und die Verschiebungselemente an.auto
wählt beschriftet oder ausgewählt basierend auf der Anzahl der Elemente, die Sie haben. beschriftet für 1-3 Artikel und ausgewählt für 3+ Artikel.Przemysławs Antwort in Kotlin als Erweiterungsfunktion
@SuppressLint("RestrictedApi")
fun BottomNavigationView.disableShiftMode() {
val menuView = getChildAt(0) as BottomNavigationMenuView
try {
val shiftingMode = menuView::class.java.getDeclaredField("mShiftingMode")
shiftingMode.isAccessible = true
shiftingMode.setBoolean(menuView, false)
shiftingMode.isAccessible = false
for (i in 0 until menuView.childCount) {
val item = menuView.getChildAt(i) as BottomNavigationItemView
item.setShiftingMode(false)
// set once again checked value, so view will be updated
item.setChecked(item.itemData.isChecked)
}
} catch (e: NoSuchFieldException) {
Log.e(TAG, "Unable to get shift mode field", e)
} catch (e: IllegalStateException) {
Log.e(TAG, "Unable to change value of shift mode", e)
}
}
Verwendung (mit Kotlin Android Extensions):
bottom_navigation_view.disableShiftMode()
Funktioniert bei mir
bottomNavigationView.setLabelVisibilityMode(LabelVisibilityMode.LABEL_VISIBILITY_LABELED);
oder
<android.support.design.widget.BottomNavigationView
app:labelVisibilityMode="labeled" />
Um die Textanimation zu deaktivieren und die Schriftgröße zu verringern, verwenden Sie Folgendes in Ihrer Datei dimensions.xml:
<dimen name="design_bottom_navigation_text_size">10sp</dimen>
<dimen name="design_bottom_navigation_active_text_size">10sp</dimen>
Navigate
-> File...
> design_bottom_navigation_item.xml
sehen , dass es keinen anderen Weg.
AKTUALISIEREN
in Android SDK - Version 28 und höher sie haben sich geändert item.setShiftingMode(false)
zuitem.setShifting(false)
Auch sie haben das Feld entfernt mShiftingMode
So wird die Nutzung sein
BottomNavigationHelper.removeShiftMode(bottomNav);
bottomNav.setLabelVisibilityMode(LabelVisibilityMode.LABEL_VISIBILITY_LABELED);
private static final class BottomNavigationHelper {
@SuppressLint("RestrictedApi")
static void removeShiftMode(BottomNavigationView view) {
BottomNavigationMenuView menuView = (BottomNavigationMenuView) view.getChildAt(0);
for (int i = 0; i < menuView.getChildCount(); i++) {
BottomNavigationItemView item = (BottomNavigationItemView) menuView.getChildAt(i);
//noinspection RestrictedApi
item.setShifting(false);
item.setLabelVisibilityMode(LabelVisibilityMode.LABEL_VISIBILITY_LABELED);
// set once again checked value, so view will be updated
//noinspection RestrictedApi
item.setChecked(item.getItemData().isChecked());
}
}
}
Wie andere bereits betont haben, ist es seit der Unterstützung der Bibliothek 28.0.0-alpha1 möglich:
<android.support.design.widget.BottomNavigationView
app:labelVisibilityMode="labeled" />
oder Sie können es programmgesteuert einstellen .
Hinweis: Wenn Sie ein Upgrade von einer älteren Version der Support-Bibliothek durchführen, vergessen Sie nicht, die SDK-Kompilierungsversion zu aktivieren. Überprüfen Sie die Versionen der Support-Bibliothek hier: Versionen der Support-Bibliothek
Möglicherweise wird beim Kompilieren jedoch weiterhin die Meldung labelVisibilityMode nicht gefunden angezeigt , wenn Ihre App von älteren Versionen der Designunterstützungsbibliothek abhängt. Wenn dies der Fall ist, versuchen Sie, ein Upgrade auf eine Version der angegebenen Abhängigkeit durchzuführen, die mindestens von der Version 28.0.0-alpha1 der Designunterstützungsbibliothek abhängt. Wenn dies nicht möglich ist, definieren Sie die Abhängigkeit explizit.
Wenn Sie Gradle verwenden
So fügen Sie in Ihrem build.gradle explizit Abhängigkeiten zur Designunterstützung hinzu :
Implementierung 'com.android.support:design:28.0.0'
Für aktualisierte Antwort mit der Standardeinstellung. Update auf die neueste Designbibliothek
Implementierung "com.android.support:design:28.0.0"
und in Ihre BottomNavigationView-XML-Attribute einfügen
app:itemHorizontalTranslationEnabled="false"
Sie können es auch programmatisch ausdrücken
bottomNavigationView.setItemHorizontalTranslationEnabled(false);
Die Quelle finden Sie hier BottomNavigationView
Hoffe das hilft dir.
app:labelVisibilityMode
?
Zu Ihrem BottomNavigationView
hinzufügenapp:labelVisibilityMode="unlabeled"
<android.support.design.widget.BottomNavigationView
app:menu="@menu/bn_menu"
android:layout_height="56dp"
android:layout_width="match_parent"
app:labelVisibilityMode="unlabeled">
</android.support.design.widget.BottomNavigationView>
was zu folgendem führt
Es ist sehr einfach. Fügen Sie einfach eine Eigenschaft in BottomNaviationView hinzu
app:labelVisibilityMode="unlabeled"
Ich hatte ein seltsames Verhalten mit BottomNavigationView. Wenn ich ein Element / Fragment darin ausgewählt habe, drückt das Fragment BottomNavigationView etwas nach unten, sodass der Text von BottomNavigationView unter dem Bildschirm angezeigt wird, sodass nur Symbole sichtbar sind und der Text beim Klicken auf ein Element ausgeblendet wird.
Wenn Sie mit diesem seltsamen Verhalten konfrontiert sind, dann ist hier die Lösung. Einfach entfernen
android:fitsSystemWindows="true"
in Ihrem Root-Layout des Fragments. Einfach entfernen und boomen! BottomNavigationView funktioniert einwandfrei, jetzt kann es mit Text und Symbol angezeigt werden. Ich hatte dies in meinem Root CoordinatorLayout des Fragments.
Vergessen Sie auch nicht hinzuzufügen
BottomNavigationViewHelper.disableShiftMode(bottomNavigationView);
in Ihrer Aktivität, um den Schaltmodus zu deaktivieren. Es hängt zwar nicht genau mit der gestellten Frage zusammen, aber ich finde das trotzdem hilfreich.
Dies ist eine Bibliothek von Drittanbietern, die ich verwende. Sie verfügt über viele Anpassungsoptionen wie das Deaktivieren des Schichtmodus, das Anzeigen nur von Symbolen , das Festlegen der Symbolgröße usw. BottomNavigationViewEx
Wenn Sie auch diese nervige kleine Animation am oberen Rand loswerden möchten, benötigen Sie mehr Reflexionscode. Hier ist die Komplettlösung, mit der Animationen entfernt werden:
@SuppressLint("RestrictedApi")
private static void disableShiftMode(BottomNavigationView view) {
BottomNavigationMenuView menuView = (BottomNavigationMenuView) view.getChildAt(0);
try {
Field shiftingMode = menuView.getClass().getDeclaredField("mShiftingMode");
shiftingMode.setAccessible(true);
shiftingMode.setBoolean(menuView, false);
shiftingMode.setAccessible(false);
for (int i = 0; i < menuView.getChildCount(); i++) {
BottomNavigationItemView item = (BottomNavigationItemView) menuView.getChildAt(i);
item.setShiftingMode(false);
Field shiftAmount = item.getClass().getDeclaredField("mShiftAmount");
shiftAmount.setAccessible(true);
shiftAmount.setInt(item, 0);
shiftAmount.setAccessible(false);
item.setChecked(item.getItemData().isChecked());
}
} catch (NoSuchFieldException e) {
Timber.e(e, "Unable to get fields");
} catch (IllegalAccessException e) {
Timber.e(e, "Unable to change values");
}
}
Und stellen Sie sicher, dass Sie dies zu Ihrer Proguard-Konfigurationsdatei hinzufügen:
-keepclassmembers class android.support.design.internal.BottomNavigationMenuView {
boolean mShiftingMode;
}
-keepclassmembers class android.support.design.internal.BottomNavigationItemView {
int mShiftAmount;
}
Aktualisieren Sie Ihre Support-Bibliothek auf 28.0.0.
bottomNav.setLabelVisibilityMode(LabelVisibilityMode.LABEL_VISIBILITY_LABELED);
Wenn Sie support: design: 28.0.0 verwenden, fügen Sie diese Zeilen-App hinzu: labelVisibilityMode = "unlabeled" zu Ihrer BottomNavigationView
Ich möchte nur hinzufügen, dass über dieser Methode disableShiftMode auch unter Code hinzugefügt wird. @ SuppressLint ("RestrictedApi")
https://android.jlelse.eu/disable-shift-label-animation-from-bottom-navigation-android-b42a25dcbffc
1
<com.google.android.material.bottomnavigation.BottomNavigationView
...
app:itemHorizontalTranslationEnabled="false"/>
2
<com.google.android.material.bottomnavigation.BottomNavigationView
...
app:labelVisibilityMode="labeled"/>
3
<resources xmlns:tools="http://schemas.android.com/tools">
<dimen name="design_bottom_navigation_active_text_size"
tools:override="true">12sp</dimen>
Sie können dies verwenden, um sowohl Text als auch Symbole in BottomNevigationView für 3 bis 5 Elemente anzuzeigen und die Verschiebung zu beenden.
app:labelVisibilityMode="labeled"
In BottmNevigationView für 5 Elemente treten jedoch Probleme beim Schneiden von Langtext auf. Dafür habe ich gute Lösungen gefunden, um das Verschieben von Text zu stoppen, sowie Symbole von BottomNevigationView. Sie können auch das Verschieben von Text und Symbolen in BottomNevigationView beenden. Hier finden Sie Snipshots des Codes.
1. Fügen Sie diese Codezeile wie gezeigt in BottomNevigationView hinzu
<android.support.design.widget.BottomNavigationView
android:id="@+id/bottom_navigation"
android:layout_width="match_parent"
android:layout_height="@dimen/seventy_dp"
android:layout_semitransparent="true"
android:background="@color/colorBottomNev"
android:showAsAction="always|withText"
app:itemIconTint="@drawable/bottom_navigation_colors"
app:itemTextColor="@drawable/bottom_navigation_colors"
app:itemTextAppearanceActive="@style/BottomNavigationViewTextStyle"
app:itemTextAppearanceInactive="@style/BottomNavigationViewTextStyle"
app:menu="@menu/bottom_navigation_menu"
app:labelVisibilityMode="labeled"/>
2. Fügen Sie Menüelemente wie folgt hinzu: -
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_catalogue"
android:icon="@drawable/catalogue"
android:title="@string/catalogue"
android:enabled="true"
app:showAsAction="ifRoom" />
<item
android:id="@+id/action_contracts"
android:icon="@drawable/contract"
android:title="@string/contracts"
android:enabled="true"
app:showAsAction="ifRoom" />
<item
android:id="@+id/action_prospects"
android:icon="@drawable/prospect"
android:title="@string/prospects"
android:enabled="true"
app:showAsAction="ifRoom" />
<item
android:id="@+id/action_performance"
android:icon="@drawable/performance"
android:title="@string/performance"
android:enabled="true"
app:showAsAction="ifRoom" />
<item
android:id="@+id/action_advance"
android:icon="@drawable/advance"
android:title="@string/advance"
android:enabled="true"
app:showAsAction="ifRoom" />
</menu>
3. Fügen Sie diesen Stil in die Datei style.xml ein:
<style name="BottomNavigationViewTextStyle">
<item name="android:fontFamily">@font/montmedium</item>
<item name="android:textSize">10sp</item>
<item name="android:duplicateParentState">true</item>
<item name="android:ellipsize">end</item>
<item name="android:maxLines">1</item>
</style>
4) Fügen Sie diese in den Ordner Dimen ein
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools">
<dimen name="design_bottom_navigation_text_size" tools:override="true">10sp</dimen>
<dimen name="design_bottom_navigation_active_text_size" tools:override="true">10sp</dimen>
</resources>
Ich habe Hilfe von diesem Link bekommen und Link erhalten. Sie können auch Hilfe erhalten, indem Sie diese Links studieren. Dies hilft mir sehr. Ich hoffe, dies hilft Ihnen auch. Vielen Dank....