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.
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"
UPDATE VOM 8. Mai 2018
Sie können app:labelVisibilityMode="labeled"
Direkt in <Android.support.design.widget.BottomNavigationView />
verwenden.
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");
}
}
}
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);
}
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()
Möchten Sie diesen Effekt erzielen?
Wenn ja, empfehle ich Ihnen, BottomNavigationViewEx 。 auszuprobieren.
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);
}
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)
}
}
Alternative zu BottomNavigationViewEx: BottomBar
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"/>
versuchen Sie das, arbeitete für mich
app:labelVisibilityMode="labeled"