После удаления заголовков под значками появляется дополнительный отступ. Добавление layout_marginBottom="-16dp"удалит это заполнение, но уменьшит весь вид.
Дзиковский
Вы можете вместо установки поля установить произвольную высоту и добавить дополнительный отступ сверху. Таким образом вы можете центрировать значки.
Bolling
4
Я просто исправил это так: android:paddingTop="8dp" android:layout_marginBottom="-8dp" Это предотвращает уменьшение планки
Palm
Ответы:
207
Надеюсь, я не опоздаю на вечеринку здесь.
Но в Библиотеке поддержки дизайна 28.0.0-alpha1 вы можете использовать свойство
app:labelVisibilityMode="unlabeled"
вы также можете использовать другие значения «авто», «помеченный» и «выбранный».
@Explorex Это нижняя панель навигации Android, а упомянутые мной атрибуты являются атрибутами xml указанного класса, которые используются в теге xml указанного представления. вы также можете использовать его в коде developer.android.com/reference/com/google/android/material/…
Мне не нравится эта библиотека. он изменяет положение значка при щелчке и не позволяет зафиксировать положение значка при щелчке.
Дика
18
К сожалению, эта первая версия BottomNavigationView имела множество ограничений. И пока вы не можете удалить заголовки, просто используя API дизайна поддержки. Итак, чтобы решить это ограничение, пока Google его не реализует, вы можете сделать (используя отражение):
1. Установите заголовки пустыми в файле bottom_navigation_menu.xml.
Нет необходимости использовать отражение, вы можете получить каждый BottomNavigationItemView, вызвав findViewById()с идентификаторами пунктов меню (как это делает @NikolaDespotoski в своем ответе ).
Fred Porciúncula
1
Теперь они поддерживают удаление ярлыковapp:labelVisibilityMode="unlabeled"
Амджад Алвах
13
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;
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. Добавьте в основной вид деятельности следующие строки:
Как насчет того, чтобы удалить значок вместо текста?
Мерхави Фиссехай
Как я могу вызвать это в основном действии, где уже существует код BottomNavigation по умолчанию? @NikolaDespotoski
TiagoIB
@TiagoIB просто сделайте метод статическим и переместите его в какой-нибудь другой класс. Или оставьте его приватным и вызовите с указанными аргументами.
Никола Деспотоски
Простите, а как я могу вставить это в свой код? prntscr.com/he03j7 @NikolaDespotoski
TiagoIB
6
Это временное решение. Просто добавьте: app:itemTextColor="@android:color/transparent"это сделает любой цвет фона отключенным. Из-за этого значок выглядит приподнятым.
Я хотел удалить как анимацию сдвига, так и метки, и ни одно из решений здесь не сработало для меня, поэтому вот тот, который я построил на основе всего, что я здесь узнал:
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;
}
Просто добавьте этот метод в свой собственный BottomNavigationViewи вызовите его, передав идентификаторы пунктов меню.
Я бы рекомендовал реализовать это самостоятельно, как сказал sanf0rd в своем ответе . Но AppCompatImageViewу меня не работает. Я изменил его на ImageView. И поменял getChildAtна findViewById.
title
s из меню<item>
s?layout_marginBottom="-16dp"
удалит это заполнение, но уменьшит весь вид.android:paddingTop="8dp" android:layout_marginBottom="-8dp"
Это предотвращает уменьшение планкиОтветы:
Надеюсь, я не опоздаю на вечеринку здесь.
Но в Библиотеке поддержки дизайна 28.0.0-alpha1 вы можете использовать свойство
app:labelVisibilityMode="unlabeled"
вы также можете использовать другие значения «авто», «помеченный» и «выбранный».
источник
Хотели бы вы этого стиля?
Если это так, я рекомендую вам попробовать BottomNavigationViewEx .
источник
К сожалению, эта первая версия 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 в своем ответе ).app:labelVisibilityMode="unlabeled"
1. Установите
android:title="";
в menu / abc.xml2. Создайте следующий вспомогательный класс, использующий отражение.
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. Добавьте в основной вид деятельности следующие строки:
источник
Безотражательный подход:
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()); } }
источник
Это временное решение. Просто добавьте:
app:itemTextColor="@android:color/transparent"
это сделает любой цвет фона отключенным. Из-за этого значок выглядит приподнятым.источник
Я хотел удалить как анимацию сдвига, так и метки, и ни одно из решений здесь не сработало для меня, поэтому вот тот, который я построил на основе всего, что я здесь узнал:
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
и вызовите его, передав идентификаторы пунктов меню.источник
Я бы рекомендовал реализовать это самостоятельно, как сказал 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); } } }
источник