Eliminar las tags BottomNavigationView

Google lanzó la nueva biblioteca de soporte v25 con BottomNavigationView

enter image description here

¿Hay alguna forma de eliminar tags de elementos?

    ¿Te gustaría este estilo?

    Si es así, te recomiendo que pruebes BottomNavigationViewEx .

    Lamentablemente, esta primera versión de BottomNavigationView viene con muchas limitaciones. Y por ahora no puedes eliminar los títulos simplemente usando la API de diseño de soporte. Entonces, para resolver esta limitación mientras google no lo implementa, puedes hacerlo (usando la reflexión):

    1. Establezca los títulos vacíos desde el archivo bottom_navigation_menu.xml.

    2. Extiende el BottomNavigationView:

      public class MyBottomNavigationView extends BottomNavigationView { public MyBottomNavigationView(Context context, AttributeSet attrs) { super(context, attrs); centerMenuIcon(); } private void centerMenuIcon() { BottomNavigationMenuView menuView = getBottomMenuView(); if (menuView != null) { for (int i = 0; i < menuView.getChildCount(); i++) { BottomNavigationItemView menuItemView = (BottomNavigationItemView) menuView.getChildAt(i); AppCompatImageView icon = (AppCompatImageView) menuItemView.getChildAt(0); FrameLayout.LayoutParams params = (LayoutParams) icon.getLayoutParams(); params.gravity = Gravity.CENTER; menuItemView.setShiftingMode(true); } } } private BottomNavigationMenuView getBottomMenuView() { Object menuView = null; try { Field field = BottomNavigationView.class.getDeclaredField("mMenuView"); field.setAccessible(true); menuView = field.get(this); } catch (NoSuchFieldException | IllegalAccessException e) { e.printStackTrace(); } return (BottomNavigationMenuView) menuView; } } 

    3. Agregue al layout.xml esta vista personalizada

    Para más detalles, he implementado esto en Github

    1. Establecer android:title=""; en el menú / abc.xml

    2. Crea la siguiente clase de ayudante que está usando la reflexión

     import android.support.design.internal.BottomNavigationMenuView; import android.support.design.widget.BottomNavigationView; import android.support.v7.widget.AppCompatImageView; import android.util.Log; import android.view.Gravity; import android.widget.FrameLayout; 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); item.setPadding(0, 15, 0, 0); // 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); } } } 

    3. En su actividad principal, agregue estas líneas:

     mBottomNav = (BottomNavigationView) findViewById(R.id.navigation); BottomNavigationViewHelper.disableShiftMode(mBottomNav); 

    Espero no llegar tarde a la fiesta aquí.

    Pero a partir de Android Support Library 28.0.0-alpha1 puede usar la propiedad

     app:labelVisibilityMode="unlabeled" 

    BottomNavigationView sin etiquetas

    también puede usar otros valores “auto”, “etiquetado” y “seleccionado”.

    Enfoque sin reflections:

     private void removeTextLabel(@NonNull BottomNavigationView bottomNavigationView, @IdRes int menuItemId) { View view = bottomNavigationView.findViewById(menuItemId); if (view == null) return; if (view instanceof MenuView.ItemView) { ViewGroup viewGroup = (ViewGroup) view; int padding = 0; for (int i = 0; i < viewGroup.getChildCount(); i++) { View v = viewGroup.getChildAt(i); if (v instanceof ViewGroup) { padding = v.getHeight(); viewGroup.removeViewAt(i); } } viewGroup.setPadding(view.getPaddingLeft(), (viewGroup.getPaddingTop() + padding) / 2, view.getPaddingRight(), view.getPaddingBottom()); } } 

    Esta es una solución temporal. Simplemente agregue: app:itemTextColor="@android:color/transparent" Eso lo hará independientemente del color de fondo, apareciendo deshabilitado. Hace que el ícono se vea elevado.

    Quise eliminar tanto la animación de turno como las tags y ninguna de las soluciones aquí funcionó bien para mí, así que aquí está la que construí en base a todo lo que aprendí aquí:

     public void removeLabels(@IdRes int... menuItemIds) { getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { @Override public boolean onPreDraw() { getViewTreeObserver().removeOnPreDrawListener(this); // this only needs to be calculated once for an unchecked item, it'll be the same value for all items ViewGroup uncheckedItem = findFirstUncheckedItem(menuItemIds); View icon = uncheckedItem.getChildAt(0); int iconTopMargin = ((LayoutParams) uncheckedItem.getChildAt(0).getLayoutParams()).topMargin; int desiredTopMargin = (uncheckedItem.getHeight() - uncheckedItem.getChildAt(0).getHeight()) / 2; int itemTopPadding = desiredTopMargin - iconTopMargin; for (int id : menuItemIds) { ViewGroup item = findViewById(id); // remove the label item.removeViewAt(1); // and then center the icon item.setPadding(item.getPaddingLeft(), itemTopPadding, item.getPaddingRight(), item.getPaddingBottom()); } return true; } }); } @SuppressLint("RestrictedApi") private ViewGroup findFirstUncheckedItem(@IdRes int... menuItemIds) { BottomNavigationItemView item = findViewById(menuItemIds[0]); int i = 1; while (item.getItemData().isChecked()) { item = findViewById(menuItemIds[i++]); } return item; } 

    Simplemente agregue este método a su BottomNavigationView personalizado y BottomNavigationView pasando los identificadores de los elementos del menú.

    Te recomiendo que lo implementes solo, ya que Sanf0rd dio su respuesta . Pero AppCompatImageView no funciona para mí. Lo cambié a ImageView . Y cambió getChildAt para findViewById .

    También oculto todas las tags de elementos no seleccionados.

     private void centerMenuIcon() { BottomNavigationMenuView menuView = getBottomMenuView(); if (menuView != null) { for (int i = 0; i < menuView.getChildCount(); i++) { BottomNavigationItemView menuItemView = (BottomNavigationItemView) menuView.getChildAt(i); TextView smallText = (TextView) menuItemView.findViewById(R.id.smallLabel); smallText.setVisibility(View.INVISIBLE); //TextView largeText = (TextView) menuItemView.findViewById(R.id.largeLabel); ImageView icon = (ImageView) menuItemView.findViewById(R.id.icon); FrameLayout.LayoutParams params = (LayoutParams) icon.getLayoutParams(); params.gravity = Gravity.CENTER; menuItemView.setShiftingMode(true); } } }