Google hat mit BottomNavigationView eine neue Support-Bibliothek v25 veröffentlicht
Gibt es eine Möglichkeit, Artikeletiketten 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 wird
Antworten:
Möchten Sie diesen Stil?
Wenn ja, empfehle ich Ihnen, BottomNavigationViewEx zu versuchen .
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
BottomNavigationItemView
indem Sie findViewById()
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 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);
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());
}
}
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.
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 in ImageView
. Und geändert getChildAt
zu 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);
}
}
}
title
s aus dem Menü<item>
s zu entfernen ?