Видаліть мітки BottomNavigationView


85

Google випустив нову бібліотеку підтримки v25 з BottomNavigationView

введіть тут опис зображення

чи є спосіб зняти ярлики елементів?


1
Ви намагалися видалити titles з меню <item>s?
Mike M.

8
Після видалення заголовків під піктограмами з’являється додаткове заповнення. Додавання layout_marginBottom="-16dp"видалить це заповнення, але зменшить весь вигляд.
dzikovskyy

Ви можете замість встановлення поля, встановити власну висоту та додати трохи додаткових відступів у верхню частину. Таким чином ви можете відцентрувати піктограми.
Боулінг

4
Я просто виправив це так: android:paddingTop="8dp" android:layout_marginBottom="-8dp" Це запобігає зменшенню штанги
Палм,

Відповіді:


208

Сподіваюся, я не запізнився на вечірку тут.

Але що стосується бібліотеки підтримки дизайну 28.0.0-alpha1, ви можете використовувати властивість

app:labelVisibilityMode="unlabeled"

BottomNavigationView без міток

Ви також можете використовувати інші значення "авто", "позначено" та "вибрано".


яка бібліотека підтримки? v7 чи дизайн?
Sagar Maiyad

бібліотека підтримки дизайну 28.0.0
Абдул-Азіз-Ніазі

найбільш очікувана особливість.
бікрам

1
У якому класі ви пишете це?
Explorex

1
@Explorex Це нижній перегляд навігації для Android, і атрибути, які я згадав, є атрибутами xml зазначеного класу, що використовуються в тезі xml згаданого подання. ви можете використовувати його в коді занадто developer.android.com/reference/com/google/android/material/…
Абдул-Азіз-Ніазі

22

Ви хочете цей стиль?

Якщо так, то рекомендую спробувати BottomNavigationViewEx .


Мені ця бібліотека не подобається. це робить положення значка зміненим при натисканні і жодним чином не робить положення значка фіксованим при натисканні.
Діка

18

На жаль, ця перша версія BottomNavigationView мала багато обмежень. А поки що ви не можете видалити заголовки, лише використовуючи API дизайну підтримки. Отже, щоб вирішити це обмеження, поки Google не реалізує його, ви можете зробити (використовуючи відображення):

1. Встановіть заголовки порожніми у файлі bottom_navigation_menu.xml.

2. Розширює 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. Додайте до layout.xml цей customView

Для більш детальної інформації я застосував це на Github


Не потрібно використовувати роздуми, ви можете отримати кожен BottomNavigationItemView, зателефонувавши findViewById()за допомогою ідентифікаторів пунктів меню (так само, як це робить @NikolaDespotoski у своїй відповіді ).
Fred Porciúncula,

1
Вони підтримують видалення ярликів заразapp:labelVisibilityMode="unlabeled"
Amjad Alwareh

13

1. Встановити android:title="";в меню / abc.xml

2. Створіть нижченаведений допоміжний клас, який використовує рефлексію

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. У своїй основній діяльності додайте такі рядки:

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

11

Безрефлексійний підхід:

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

1
Як щодо того, якщо я хочу видалити піктограму замість тексту
Merhawi Fissehaye

Як я можу це викликати в основній діяльності, де код за замовчуванням BottomNavigation вже існує? @NikolaDespotoski
TiagoIB

@TiagoIB просто робить метод статичним і переміщує в інший клас. Або залиште його приватним і зателефонуйте з вказаними аргументами.
Нікола Деспотоскі

Вибачте, але як я міг вставити його у свій код? prntscr.com/he03j7 @NikolaDespotoski
TiagoIB

6

Це тимчасове виправлення. Просто додайте: app:itemTextColor="@android:color/transparent"Це зробить його незалежно від кольору тла, здаючись відключеним. Це робить піктограму виглядати піднесеною.


2

Я хотів видалити як анімацію перемикання, так і мітки, і жодне з рішень тут не працювало для мене добре, тому ось одне, яке я створив, спираючись на все, що я тут дізнався:

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

Просто додайте цей метод до свого користувацького BottomNavigationViewі назвіть його передаванням ідентифікаторів пунктів меню.


1

Я б порекомендував реалізувати це самостійно, як дав у відповіді sanf0rd . Але AppCompatImageViewце не працює для мене. Я змінив його на ImageView. І змінився getChildAtна findViewById.

Також я приховую всі ярлики невибраних предметів.

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);
        }
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.