14

Google wydała nowe wsparcie V25 biblioteka z BottomNavigationViewUsuń BottomNavigationView etykiet

enter image description here

jest jakiś sposób, aby usunąć elementy etykiety?

+0

Czy próbowałeś usunąć 'title's z menu' 's? –

+3

Po usunięciu tytułów pojawia się dodatkowe wypełnienie pod ikonami. Dodanie 'layout_marginBottom =" - 16dp "' spowoduje usunięcie tego dopełnienia, ale zmniejszy cały widok. – dzikovskyy

+0

Możesz zamiast ustawiać margines, ustaw niestandardową wysokość i dodaj dodatkowe dopełnienie do góry. W ten sposób możesz wyśrodkować ikony. – Bolling

Odpowiedz

14

Niestety ta pierwsza wersja BottomNavigationView pojawiła się z wieloma ograniczeniami. Na razie nie można usunąć tytułów za pomocą interfejsu API projektowania wsparcia. Aby rozwiązać to ograniczenie, gdy google go nie implementuje, możesz wykonać (używając refleksji):

1. Ustaw tytuły puste z pliku bottom_navigation_menu.xml.

2. Rozszerza 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. Dodać do layout.xml ten CustomView

Więcej szczegółów I wprowadziły to na Github

+0

Czy będzie działać na apis poniżej 21? –

6

Reflectionless podejście:

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

Co jeśli chcę usunąć ikonę zamiast tekstu –

+1

Jak korzystać z tego kodu? –

+0

Jak mogę wywołać tę funkcję w głównej czynności, w której domyślny kod BottomNavigation już istnieje? @NikolaDespotoski – TiagoIB

2

To jest tymczasowa poprawka. Wystarczy dodać: app:itemTextColor="@android:color/transparent" To sprawi, że niezależnie od koloru tła, będzie wyłączone. Sprawia, że ​​ikona wygląda na wyższą.

17

Chcesz tego stylu?

Jeśli tak, to polecam spróbować BottomNavigationViewEx.

+1

najlepsza biblioteka dla dolnego menu. dzięki ... działa dobrze. –

0

Polecam do wdrożenia go przez siebie, jak sanf0rd gave in his answer. Ale AppCompatImageView nie działa dla mnie. Zmieniłem go na ImageView. I zmieniono getChildAt na findViewById.

Ukrywam też wszystkie etykiety niewybranych pozycji.

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); 
     } 
    } 
} 
2
  1. Zestaw ANDROID tytułowy = ""; w menu/abc.xml

  2. Utwórz poniżej klasy pomocnika, który jest przy użyciu odbicia

`

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

`

  1. Następnie w głównej aktywności dodaj te linie: mBottomNav = (BottomNavigationView) findViewById (R.id.navigation); BottomNavigationViewHelper.disableShiftMode (mBottomNav);