wake-up-neo.com

Deaktivieren des BottomNavigationView-Modus

BottomNavigationView zeigt nicht den inaktiven Menütitel an.

Wie zeige ich Titel aller Menüelemente in bottomNavigationBar an? Das Problem ist, dass in meinem Fall nur der Titel des Elements angezeigt wird, auf das geklickt wird.

 enter image description here

120

Die Implementierung von BottomNavigationView hat eine Bedingung: Wenn mehr als 3 Elemente vorhanden sind, verwenden Sie den Shift-Modus.

Momentan können Sie es nicht durch die vorhandene API ändern. Die einzige Möglichkeit, den Shift-Modus zu deaktivieren, ist die Verwendung der Reflektion.

Du brauchst 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 Ihre BottomNavigationView-Methode an. Denken Sie jedoch daran, dass Sie die Menüansicht aus Ihrem Code heraus aufblasen. Sie müssen sie nach dem Aufblasen ausführen.

Verwendungsbeispiel:

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 Ihrer BottomNavigationView ändern.

UPDATE

Sie müssen auch die Proguard-Konfigurationsdatei (z. B. proguard-rules.pro) aktualisieren. Der obige Code verwendet Reflektion und funktioniert nicht, wenn Proguard das Feld mShiftingMode verschleiert.

-keepclassmembers class Android.support.design.internal.BottomNavigationMenuView { 
    boolean mShiftingMode; 
}

Vielen Dank an Muhammad Alfaifi, dass Sie auf diese Ausgabe und Bereitstellungsschnipsel hingewiesen haben.

UPDATE 2

Wie Jolanda Verhoef darauf hinwies, bieten die neue Support-Bibliothek (28.0.1-alpha1) und die neue Materialkomponenten-Bibliothek (1.0.0-beta01) eine öffentliche Eigenschaft, mit der der Verschiebemodus über 3 Menüelemente geändert werden kann. 

<com.google.Android.material.bottomnavigation.BottomNavigationView
    ...
    app:labelVisibilityMode="labeled"
    ... 
/>

In der Materialkomponentenbibliothek gilt dies auch, wenn 5 Menüelemente vorhanden sind.

Seit der Unterstützungsbibliothek 28.0.0-alpha1:

<Android.support.design.widget.BottomNavigationView
    app:labelVisibilityMode="labeled" />
36
Junbin Deng

Um die Textanimation zu deaktivieren, können Sie auch Folgendes in Ihrer Datei dimens.xml verwenden:

<dimen name="design_bottom_navigation_active_text_size">12sp</dimen>
21
Pafoid

Sie können jetzt app:labelVisibilityMode="[labeled, unlabeled, selected, auto]" in 28-alpha verwenden.

  • labeledhält alle Beschriftungen sichtbar.
  • unlabeledzeigt nur Symbole an.
  • selectedzeigt nur die Beschriftung für das ausgewählte Element und die Schichtelemente an.
  • autowird anhand der Anzahl der Elemente, die Sie haben, gekennzeichnet oder ausgewählt. gekennzeichnet für 1-3 Artikel und ausgewählt für 3+ Artikel.
16
Lunkie

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()
16
ElegyD

Funktioniert bei mir

bottomNavigationView.setLabelVisibilityMode(LabelVisibilityMode.LABEL_VISIBILITY_LABELED);

oder

<Android.support.design.widget.BottomNavigationView
    app:labelVisibilityMode="labeled" />
9
UgAr0FF

Um die Textanimation zu deaktivieren und die Schriftgröße zu verringern, verwenden Sie dies in Ihrer Datei dimens.xml:

<dimen name="design_bottom_navigation_text_size">10sp</dimen> 
<dimen name="design_bottom_navigation_active_text_size">10sp</dimen>
8
Abhishek

Wie andere darauf hingewiesen haben, ist es seit support library 28.0.0-alpha1 möglich:

<Android.support.design.widget.BottomNavigationView
app:labelVisibilityMode="labeled" />

oder Sie können es programmgesteuert setzen.

Hinweis: Wenn Sie ein Upgrade von einer älteren Version der Unterstützungsbibliothek durchführen, vergessen Sie nicht, die SDK-Version zu kompilieren .. _. Überprüfen Sie die Versionen der Unterstützungsbibliothek hier: Versionen der Unterstützungsbibliothek

Es kann jedoch immer noch die Meldung labelVisibilityMode nicht gefunden beim Kompilieren angezeigt werden, wenn Ihre App von älteren Versionen der Design-Support-Bibliothek abhängig ist. Wenn dies der Fall ist, versuchen Sie, ein Upgrade auf eine Version der angegebenen Abhängigkeit durchzuführen. Dies hängt von mindestens der Version von 28.0.0-alpha1 der Design-Support-Bibliothek ab. Wenn dies nicht möglich ist, definieren Sie die Abhängigkeit explizit.

Wenn Sie Gradle verwenden

  1. Sie können Ihre Dependendies überprüfen, indem Sie die Aufgabe Abhängigkeiten ausführen und nach der Versionsnummer von com.Android.support:design suchen.
  2. So fügen Sie die Konstruktionsunterstützungsabhängigkeit explizit in Ihrem build.gradle hinzu: 

    implementierung 'com.Android.support:design:28.0.0'

5

Für aktualisierte Antwort mit der Standardeinstellung. Aktualisieren Sie auf die neueste Design-Bibliothek

implementierung "com.Android.support:design:28.0.0"

und fügen Sie Ihre BottomNavigationView-XML-Attribute hinzu

app:itemHorizontalTranslationEnabled="false"

sie können es auch programmgesteuert setzen 

bottomNavigationView.setItemHorizontalTranslationEnabled(false);

Quelle finden Sie hier BottomNavigationView

Hoffe das hilft dir.

4
Lester L.

AKTUALISIEREN

in Android SDK Version 28 und darüber haben sieitem.setShiftingMode(false)initem.setShifting(false)

Sie haben auch das FeldmShiftingModeentfernt.

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());
        }
    }
}
3

Ich hatte ein seltsames Verhalten bei BottomNavigationView. Wenn ich ein Element/ein Fragment darin auswählte, wird das BottomNavigationView-Element etwas tiefer gedrückt, sodass der Text von BottomNavigationView unter dem Bildschirm angezeigt wird, sodass nur Symbole angezeigt wurden und der Text beim Klicken auf ein Element ausgeblendet wurde.

Wenn Sie mit diesem komischen Verhalten konfrontiert sind, ist hier die Lösung

Android:fitsSystemWindows="true"

in Ihrem Root-Layout von Fragment. Einfach entfernen und bummen! BottomNavigationView funktioniert gut, jetzt kann es mit Text und Symbol angezeigt werden. Ich hatte dies in meinem CoordinatorLayout von fragment.

Vergiss auch nicht hinzuzufügen

BottomNavigationViewHelper.disableShiftMode(bottomNavigationView);

in Ihrer Aktivität, um den Umschaltmodus zu deaktivieren . Obwohl dies nicht genau mit der gestellten Frage zusammenhängt, finde ich dies dennoch hilfreich.

2

Dies ist eine Bibliothek von Drittanbietern, die ich verwende, und sie bietet viele Anpassungsoptionen, z. B. Deaktivieren des Shift-Modus, Anzeigen nur von Symbolen, Einstellen der Symbolgröße usw. ... /. BottomNavigationViewEx

2
Pei

So entfernen Sie Animationen vollständig:

Wenn Sie auch diese lästige kleine Animation am oberen Rand loswerden möchten, benötigen Sie mehr Reflektionscode. Hier ist die komplette Lösung, die alle Animationen entfernt:

@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;
}
2

Zu deiner BottomNavigationView füge app:labelVisibilityMode="unlabeled" hinzu

<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

 Android Bottom Navigation View Disable Text and Shift

1

Wenn Sie Support verwenden: design: 28.0.0 Fügen Sie diese Zeile app: labelVisibilityMode = "unlabeled" zu Ihrer BottomNavigationView hinzu

1
Omar Hassan

Es ist sehr einfach. Fügen Sie einfach eine Eigenschaft in BottomNaviationView hinzu

app:labelVisibilityMode="unlabeled"
1
Nevil Ghelani

aktualisieren Sie Ihre Support-Bibliothek auf 28.0.0.

bottomNav.setLabelVisibilityMode(LabelVisibilityMode.LABEL_VISIBILITY_LABELED);
0
M Moersalin

ich möchte nur hinzufügen, dass oberhalb dieser Methode disableShiftMode auch folgenden Code hinzugefügt wird . @ SuppressLint ("RestrictedApi")

0
Aleesha Kanwal