android - color - BottomNavigationView muestra íconos y etiquetas de texto en todo momento
bottomnavigationview ejemplo (10)
Estoy usando android.support.design.widget.BottomNavigationView de la biblioteca de soporte de diseño versión 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"/>
Cuando solo hay tres acciones en @ menu / bottom_navigation_main, muestra íconos y etiquetas de texto en todo momento.
¿Cuál es la manera de mostrar iconos y etiquetas de texto en todo momento cuando hay más de tres acciones?
Alternativa a BottomNavigationViewEx : BottomBar
Aquí hay una función de extensión de Kotlin que combina la solución @STAR_ZERO y @ KishanSolanki124.
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)
}
}
}
Para usarlo:
myBottomNavigation.disableShiftMode()
Es difícil en la versión 25.
Prueba este código. Pero creo que no es una buena solución.
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);
}
Para cualquiera que todavía esté buscando una solución y no quiera depender de bibliotecas de terceros o reflexión en tiempo de ejecución, BottomNavigationView en Support Library 28 / Jetpack admite de forma nativa tener siempre etiquetas de texto.
This es el método que estás buscando.
O en XML,
app:labelVisibilityMode="labeled"
Para mostrar los títulos hasta el final. Prueba este código de Kotlin:
@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)
}
}
Puede usar esto para mostrar texto e íconos en BottomNevigationView
app:labelVisibilityMode="labeled"
Si está utilizando esto, podrá ver tanto el icono como el texto.
<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"/>
en la clase BottomNavigationView hay un campo BottomNavigationMenuView y en BottomNavigationMenuView hay un campo BottomNavigationItemView [], que son los elementos en la barra inferior.
Digamos que n es el número de elementos, BottomNavigationMenuView llamará a BottomNavigationItemView.setShiftingMode (n> 3) en cada miembro de la matriz BottomNavigationItemView []. Esta función decide el comportamiento (mostrar el título siempre o solo al seleccionarlo).
así que la forma de mostrar siempre los títulos es intentar llamar a este método y puede usar la reflexión para acceder a los campos privados.
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);
}
prueba esto, funcionó para mí
app:labelVisibilityMode="labeled"
ACTUALIZACIÓN DEL 8 DE MAYO DE 2018
Puede usar la
app:labelVisibilityMode="labeled"
directamente en
<android.support.design.widget.BottomNavigationView />
No necesito esto debajo de una solución larga.
RESPUESTA ANTERIOR
Tuve un comportamiento extraño con BottomNavigationView. Cuando estaba seleccionando cualquier elemento / fragmento en él, el fragmento empuja BottomNavigationView un poco más abajo, por lo que el texto de BottomNavigationView va debajo de la pantalla, por lo que solo los iconos estaban visibles y el texto se oculta al hacer clic en cualquier elemento.
Si se enfrenta a ese comportamiento extraño, entonces esta es la solución. Solo eliminar
android:fitsSystemWindows="true"
en su diseño raíz de fragmento. Solo elimina esto y ¡boom! BottomNavigationView funcionará bien, ahora se puede mostrar con texto e ícono. Tenía esto en mi raíz CoordinatorLayout of fragment.
Tampoco olvides agregar
BottomNavigationViewHelper.removeShiftMode(bottomNavigationView);
en su actividad para deshabilitar el modo de cambio.
Aquí está esa clase:
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");
}
}
}