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"
Sie können auch andere Werte "auto", "label" und "selected" verwenden.
@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/…
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.
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;
publicclassBottomNavigationViewHelper{
publicstaticvoiddisableShiftMode(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:
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.
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:
publicvoidremoveLabels(@IdResint... menuItemIds){
getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@OverridepublicbooleanonPreDraw(){
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());
}
returntrue;
}
});
}
@SuppressLint("RestrictedApi")private ViewGroup findFirstUncheckedItem(@IdResint... 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.
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.
title
s aus dem Menü<item>
s zu entfernen ?layout_marginBottom="-16dp"
wird diese Auffüllung entfernt, die gesamte Ansicht wird jedoch kleiner.android:paddingTop="8dp" android:layout_marginBottom="-8dp"
Dies verhindert, dass die Leiste kleiner wirdAntworten:
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"
Sie können auch andere Werte "auto", "label" und "selected" verwenden.
quelle
Möchten Sie diesen Stil?
Wenn ja, empfehle ich Ihnen, BottomNavigationViewEx zu versuchen .
quelle
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
quelle
BottomNavigationItemView
indem SiefindViewById()
mit den Menüelement-IDs anrufen (genau wie es @NikolaDespotoski in seiner Antwort tut ).app:labelVisibilityMode="unlabeled"
1. Stellen Sie
android:title="";
in menu / abc.xml ein2. 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:
quelle
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()); } }
quelle
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.quelle
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
BottomNavigationView
und rufen Sie sie auf, indem Sie die IDs der Menüelemente übergeben.quelle
Ich würde empfehlen, es selbst zu implementieren, wie es sanf0rd in seiner Antwort gegeben hat . Funktioniert aber
AppCompatImageView
nicht für mich. Ich habe es geändert inImageView
. Und geändertgetChildAt
zufindViewById
.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); } } }
quelle