wake-up-neo.com

In BottomNavigationView werden zu jeder Zeit Symbole und Beschriftungen angezeigt

Ich verwende Android.support.design.widget.BottomNavigationView von Design Support Library Version 25

compile 'com.Android.support:design:25.0.0'

<Android.support.design.widget.BottomNavigationView
        Android:id="@+id/bottomBar"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:layout_alignParentBottom="true"
        Android:layout_gravity="center"
        app:itemBackground="@color/colorPrimary"
        app:menu="@menu/bottom_navigation_main"
        Android:forceHasOverlappingRendering="true"/>

Wenn in @ menu/bottom_navigation_main nur drei Aktionen vorhanden sind, werden sowohl Symbole als auch Beschriftungen angezeigt.

Wie können sowohl Symbole als auch Beschriftungen angezeigt werden, wenn mehr als drei Aktionen ausgeführt werden.

42

Für alle, die noch nach einer Lösung suchen und nicht auf Bibliotheken von Drittanbietern oder Laufzeitreflexion zurückgreifen möchten, unterstützt BottomNavigationView in Support Library 28/Jetpack die Verwendung von Textetiketten. 

Diese ist die Methode, nach der Sie suchen. 

Oder in XML, app:labelVisibilityMode="labeled"

98
shaishgandhi

UPDATE VOM 8. Mai 2018

Sie können app:labelVisibilityMode="labeled" Direkt in <Android.support.design.widget.BottomNavigationView /> verwenden.

Quelle: https://developer.Android.com/reference/com/google/Android/material/bottomnavigation/LabelVisibilityMode

Benötige diese Lösung nicht.

VORHERIGE ANTWORT

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.removeShiftMode(bottomNavigationView);

in Ihrer Aktivität, um den Umschaltmodus zu deaktivieren.

Hier ist diese Klasse:

public class BottomNavigationViewHelper {

    @SuppressLint("RestrictedApi")
    public static void removeShiftMode(BottomNavigationView view) {
        //this will remove shift mode for bottom navigation 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);
                // set once again checked value, so view will be updated
                item.setChecked(item.getItemData().isChecked());
            }

        } catch (NoSuchFieldException e) {
            Log.e("ERROR NO SUCH FIELD", "Unable to get shift mode field");
        } catch (IllegalAccessException e) {
            Log.e("ERROR ILLEGAL ALG", "Unable to change value of shift mode");
        }
    }
}
47

In Version 25 ist das schwierig.

Versuchen Sie diesen Code. Aber ich denke, es ist keine gute Lösung.

BottomNavigationView navigationView = (BottomNavigationView) findViewById(R.id.bottomBar);
BottomNavigationMenuView menuView = (BottomNavigationMenuView) navigationView.getChildAt(0);
for (int i = 0; i < menuView.getChildCount(); i++) {
    BottomNavigationItemView itemView = (BottomNavigationItemView) menuView.getChildAt(i);
    itemView.setShiftingMode(false);
    itemView.setChecked(false);
}
18
STAR_ZERO

Hier ist eine Kotlin-Erweiterungsfunktion, die die Lösung von @STAR_ZERO und @ KishanSolanki124 kombiniert.

fun BottomNavigationView.disableShiftMode() {
    val menuView = getChildAt(0) as BottomNavigationMenuView

    menuView.javaClass.getDeclaredField("mShiftingMode").apply {
        isAccessible = true
        setBoolean(menuView, false)
        isAccessible = false
    }

    @SuppressLint("RestrictedApi")
    for (i in 0 until menuView.childCount) {
        (menuView.getChildAt(i) as BottomNavigationItemView).apply {
            setShiftingMode(false)
            setChecked(false)
        }
    }
}

Um es zu benutzen:

myBottomNavigation.disableShiftMode()
10
chetbox

Möchten Sie diesen Effekt erzielen? 

Click here to view the image

Wenn ja, empfehle ich Ihnen, BottomNavigationViewEx 。 auszuprobieren.

9
ittianyu

in der BottomNavigationView-Klasse gibt es ein BottomNavigationMenuView-Feld und in BottomNavigationMenuView ein BottomNavigationItemView [] -Feld. Dies sind die Elemente in der unteren Leiste. 

Angenommen, n ist die Anzahl der Elemente, ruft BottomNavigationMenuView BottomNavigationItemView.setShiftingMode (n> 3) für jedes Member des BottomNavigationItemView [] - Arrays auf. Diese Funktion bestimmt das Verhalten (Titel immer oder nur bei Auswahl anzeigen). 

so können Sie die Titel immer anzeigen, indem Sie versuchen, diese Methode aufzurufen, und Sie können Reflection verwenden, um auf die privaten Felder zuzugreifen.

    BottomNavigationView bottomNavigationView= (BottomNavigationView) findViewById(R.id.bottom_navigation);


//  get the private BottomNavigationMenuView field 
        Field f = null;
        try {
            f = bottomNavigationView.getClass().getDeclaredField("mMenuView");
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
        f.setAccessible(true);
        BottomNavigationMenuView menuView=null;
        try {
             menuView = (BottomNavigationMenuView) f.get(bottomNavigationView); 
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

//  get the private BottomNavigationItemView[]  field 
        try {
            f=menuView.getClass().getDeclaredField("mButtons");
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
        f.setAccessible(true);
        BottomNavigationItemView[] mButtons=null;
        try {
            mButtons = (BottomNavigationItemView[]) f.get(menuView); 
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }


        for(int i=0;i<mButtons.length;i++){
            mButtons[i].setShiftingMode(false);
            mButtons[i].setChecked(true);
        }
5
wei wang

Um die Titel vollständig anzuzeigen. Versuchen Sie diesen Kotlin-Code:

@SuppressLint("RestrictedApi")
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_ofree)

    navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener)

    val menuView = navigation.getChildAt(0) as BottomNavigationMenuView
    for (i in 0 until menuView.childCount) {
        val itemView = menuView.getChildAt(i) as BottomNavigationItemView
        itemView.setShiftingMode(false)
        itemView.setChecked(false)
    }
}
4
Harry Zhang

Alternative zu BottomNavigationViewEx: BottomBar

1
Mateusz Budzisz

Sie können dies zum Anzeigen von Text und Symbolen in BottomNevigationView verwenden

app:labelVisibilityMode="labeled"

Wenn Sie dies verwenden, können Sie sowohl das Symbol als auch den Text anzeigen

<Android.support.design.widget.BottomNavigationView
    app:labelVisibilityMode="labeled"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:id="@+id/bottom_navigation_view"
    Android:layout_alignParentBottom="true"
    app:menu="@menu/bottom_navigation_menu"/>
0
Kumar Ajay A.K

versuchen Sie das, arbeitete für mich

app:labelVisibilityMode="labeled"
0
saigopi