Entfernen Sie die BottomNavigationView-Beschriftungen

84

Google hat mit BottomNavigationView eine neue Support-Bibliothek v25 veröffentlicht

Geben Sie hier die Bildbeschreibung ein

Gibt es eine Möglichkeit, Artikeletiketten zu entfernen?

Ali Zarei
quelle
1
Haben Sie versucht, das titles aus dem Menü <item>s zu entfernen ?
Mike M.
8
Nach dem Entfernen von Titeln werden die Symbole zusätzlich aufgefüllt. Durch Hinzufügen layout_marginBottom="-16dp"wird diese Auffüllung entfernt, die gesamte Ansicht wird jedoch kleiner.
Dzikovskyy
Anstatt den Rand festzulegen, können Sie die benutzerdefinierte Höhe festlegen und oben zusätzliche Polster hinzufügen. Auf diese Weise können Sie die Symbole zentrieren.
Bolling
4
Ich habe es einfach so behoben: android:paddingTop="8dp" android:layout_marginBottom="-8dp" Dies verhindert, dass die Leiste kleiner wird
Palm

Antworten:

204

Ich hoffe ich bin nicht zu spät zur Party hier.

Ab Design Support Library 28.0.0-alpha1 können Sie die Eigenschaft jedoch verwenden

app:labelVisibilityMode="unlabeled"

BottomNavigationView ohne Beschriftungen

Sie können auch andere Werte "auto", "label" und "selected" verwenden.

Abdul-Aziz-Niazi
quelle
Welche Unterstützungsbibliothek? v7 oder design?
Sagar Maiyad
Design Support Library 28.0.0
Abdul-Aziz-Niazi
am meisten erwartete Funktion.
Bikram
1
In welcher Klasse schreibst du das?
Explorex
1
@Explorex Dies ist die untere Navigationsansicht von Android. Die von mir erwähnten Attribute sind XML-Attribute der Klasse, die im XML-Tag dieser Ansicht verwendet werden. Sie können es auch im Code verwenden. developer.android.com/reference/com/google/android/material/…
Abdul-Aziz-Niazi
22

Möchten Sie diesen Stil?

Wenn ja, empfehle ich Ihnen, BottomNavigationViewEx zu versuchen .

ittianyu
quelle
Ich mag diese Bibliothek nicht. Dadurch wird die Symbolposition beim Klicken geändert und die Symbolposition kann beim Klicken nicht festgelegt werden.
Dika
18

Leider war diese erste Version von BottomNavigationView mit vielen Einschränkungen verbunden. Und im Moment können Sie die Titel nicht einfach mit der Support-Design-API entfernen. Um diese Einschränkung zu lösen, während Google sie nicht implementiert, können Sie Folgendes tun (mithilfe von Reflection):

1. Setzen Sie die Titel aus der Datei bottom_navigation_menu.xml leer.

2. Erweitert die 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. Fügen Sie der Datei layout.xml diese benutzerdefinierte Ansicht hinzu

Für weitere Details habe ich dies auf Github implementiert

Sanf0rd
quelle
Sie müssen keine Reflexion verwenden, Sie können jede erhalten, BottomNavigationItemViewindem Sie findViewById()mit den Menüelement-IDs anrufen (genau wie es @NikolaDespotoski in seiner Antwort tut ).
Fred Porciúncula
1
Sie unterstützen jetzt das Entfernen von Etikettenapp:labelVisibilityMode="unlabeled"
Amjad Alwareh
13

1. Stellen Sie android:title="";in menu / abc.xml ein

2. Erstellen Sie die folgende Hilfsklasse, die Reflektion verwendet

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. Fügen Sie in Ihrer Hauptaktivität die folgenden Zeilen hinzu:

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

Reflexionsloser Ansatz:

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());
    }
}
Nikola Despotoski
quelle
1
Wie wäre es, wenn ich Symbol anstelle des Textes entfernen möchte
Merhawi Fissehaye
Wie kann ich dies in der Hauptaktivität aufrufen, in der der Standardcode für BottomNavigation bereits vorhanden ist? @ NikolaDespotoski
TiagoIB
@TiagoIB macht die Methode einfach statisch und verschiebt sie in eine andere Klasse. Oder halten Sie es privat und rufen Sie es mit den angegebenen Argumenten auf.
Nikola Despotoski
Entschuldigung, aber wie könnte ich es in meinen Code einfügen? prntscr.com/he03j7 @NikolaDespotoski
TiagoIB
6

Dies ist eine vorübergehende Korrektur. Fügen Sie einfach hinzu: app:itemTextColor="@android:color/transparent"Dadurch wird die Hintergrundfarbe unabhängig von der Hintergrundfarbe deaktiviert. Dadurch wird das Symbol erhöht angezeigt.

liveneato
quelle
2

Ich wollte sowohl die Schichtanimation als auch die Beschriftungen entfernen , und keine der Lösungen hier hat für mich gut funktioniert. Hier ist die, die ich basierend auf allem, was ich hier gelernt habe, erstellt habe:

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

Fügen Sie diese Methode einfach Ihrer benutzerdefinierten Methode hinzu BottomNavigationViewund rufen Sie sie auf, indem Sie die IDs der Menüelemente übergeben.

Fred Porciúncula
quelle
1

Ich würde empfehlen, es selbst zu implementieren, wie es sanf0rd in seiner Antwort gegeben hat . Funktioniert aber AppCompatImageViewnicht für mich. Ich habe es geändert in ImageView. Und geändert getChildAtzu findViewById.

Außerdem verstecke ich alle Beschriftungen nicht ausgewählter Elemente.

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);
        }
    }
}
Mikolasan
quelle