ejemplo color bottom always android android-support-library android-support-design bottomnavigationview

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?




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 />

Fuente: https://developer.android.com/reference/com/google/android/material/bottomnavigation/LabelVisibilityMode

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"); } } }