Удалить метки BottomNavigationView

Google выпустила новую библиотеку поддержки v25 с BottomNavigationView

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

есть ли способ удалить ярлыки предметов?


person Ali Zarei    schedule 21.10.2016    source источник
comment
Вы пытались удалить titles из меню <item>s?   -  person Mike M.    schedule 21.10.2016
comment
После удаления заголовков под значками появляется дополнительный отступ. Добавление layout_marginBottom="-16dp" удалит это заполнение, но уменьшит весь вид.   -  person dzikovskyy    schedule 22.10.2016
comment
Вы можете вместо установки поля установить произвольную высоту и добавить дополнительные отступы вверху. Таким образом вы можете центрировать значки.   -  person Bolling    schedule 29.03.2017
comment
Я только что исправил вот так: android:paddingTop="8dp" android:layout_marginBottom="-8dp" Это не позволяет полоске становиться меньше   -  person Palm    schedule 17.06.2018


Ответы (8)


Надеюсь, я не опоздаю на вечеринку здесь.

Но в Библиотеке поддержки дизайна 28.0.0-alpha1 вы можете использовать свойство

app:labelVisibilityMode="unlabeled"

BottomNavigationView без ярлыков

вы также можете использовать другие значения «авто», «помеченный» и «выбранный».

person Abdul-Aziz-Niazi    schedule 28.07.2018
comment
какая библиотека поддержки? v7 или дизайн? - person Sagar Maiyad; 05.09.2018
comment
библиотека поддержки дизайна 28.0.0 - person Abdul-Aziz-Niazi; 05.09.2018
comment
В каком классе вы это пишете? - person Explorex; 31.01.2019
comment
@Explorex Это нижняя панель навигации Android, а упомянутые атрибуты являются атрибутами xml указанного класса, которые используются в теге xml указанного представления. вы также можете использовать его в коде developer.android.com/reference / com / google / android / material / - person Abdul-Aziz-Niazi; 31.01.2019

Хотели бы вы этого стиля?

Если это так, я рекомендую вам попробовать BottomNavigationViewEx.

person ittianyu    schedule 13.11.2016
comment
Мне не нравится эта библиотека. он изменяет положение значка при щелчке и не может зафиксировать положение значка при щелчке. - person Dika; 09.11.2018

К сожалению, эта первая версия 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.

person Sanf0rd    schedule 22.10.2016
comment
Нет необходимости использовать отражение, вы можете получить каждый BottomNavigationItemView, вызвав findViewById() с идентификаторами пунктов меню (точно так же, как @NikolaDespotoski делает в его ответе < / а>). - person Fred Porciúncula; 21.06.2018
comment
Теперь они поддерживают удаление ярлыков app:labelVisibilityMode="unlabeled" - person Amjad Alwareh; 04.02.2019

1. Установите android:title=""; в menu / 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);
person Community    schedule 29.11.2017

Безотражательный подход:

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());
    }
}
person Nikola Despotoski    schedule 25.10.2016
comment
Как насчет того, чтобы удалить значок вместо текста? - person Merhawi Fissehaye; 31.03.2017
comment
Как я могу вызвать это в основном действии, где уже существует код BottomNavigation по умолчанию? @NikolaDespotoski - person TiagoIB; 22.11.2017
comment
@TiagoIB просто сделайте метод статическим и переместите его в какой-нибудь другой класс. Или оставьте его частным и вызовите с указанными аргументами. - person Nikola Despotoski; 22.11.2017
comment
Извините, но как я могу вставить его в свой код? prntscr.com/he03j7 @NikolaDespotoski - person TiagoIB; 23.11.2017

Это временное решение. Просто добавьте: app:itemTextColor="@android:color/transparent" В результате цвет фона будет отключен. Из-за этого значок выглядит приподнятым.

person liveneato    schedule 07.11.2016

Я хотел удалить как анимацию сдвига, так и метки, и ни одно из решений здесь хорошо сработало для меня, поэтому вот тот, который я построил на основе всего, что я здесь узнал:

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 и вызовите его, передав идентификаторы пунктов меню.

person Fred Porciúncula    schedule 25.06.2018

Я бы рекомендовал реализовать это самостоятельно, как 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);
        }
    }
}
person Mikolasan    schedule 27.04.2017