BottomNavigationView etiketlerini kaldır


85

Google, BottomNavigationView ile yeni destek kitaplığı v25'i yayınladı

görüntü açıklamasını buraya girin

öğe etiketlerini kaldırmanın bir yolu var mı?


1
titleMenülerden <item>s çıkarmayı denediniz mi?
Mike M.

8
Başlıkları kaldırdıktan sonra simgelerin altında fazladan dolgu vardır. Eklemek layout_marginBottom="-16dp"bu dolguyu kaldıracak ancak tüm görünümü küçültecektir.
dzikovskyy

Kenar boşluğunu ayarlamak yerine, özel yükseklik ayarlayabilir ve üste fazladan dolgu ekleyebilirsiniz. Bu şekilde simgeleri ortalayabilirsiniz.
Bolling

4
Bunu şu şekilde düzelttim: android:paddingTop="8dp" android:layout_marginBottom="-8dp" Bu, çubuğun küçülmesini engeller
Palm

Yanıtlar:


208

Umarım buradaki partiye çok geç kalmamışımdır.

Ancak Tasarım Destek Kitaplığı 28.0.0-alpha1'den itibaren özelliği kullanabilirsiniz

app:labelVisibilityMode="unlabeled"

BottomNavigationView etiketsiz

"auto", "labeled" ve "selected" gibi diğer değerleri de kullanabilirsiniz.


hangi destek kitaplığı? v7 mi yoksa tasarım mı?
Sagar Maiyad

tasarım destek kitaplığı 28.0.0
Abdul-Aziz-Niazi

en çok beklenen özellik.
bikram

1
Bunu hangi sınıfta yazarsınız?
2019

1
@Explorex Bu, android'in alt gezinme görünümüdür ve bahsettiğim öznitelikler, söz konusu görünümün xml etiketinde kullanılan söz konusu sınıfın xml öznitelikleridir. bunu kodda da kullanabilirsiniz developer.android.com/reference/com/google/android/material/…
Abdul-Aziz-Niazi

22

Bu stili ister miydin?

Öyleyse, BottomNavigationViewEx'i denemenizi tavsiye ederim .


Bu kütüphaneyi sevmiyorum. tıklandığında simge konumunu değiştirir ve tıklandığında simge konumunu sabitlemenin hiçbir yolu yoktur.
Dika

18

Ne yazık ki BottomNavigationView'in bu ilk sürümü birçok sınırlama ile geldi. Ve şimdilik başlıkları yalnızca destek tasarım API'sini kullanarak kaldıramazsınız. Dolayısıyla, Google bunu uygulamazken bu sınırlamayı çözmek için şunları yapabilirsiniz (yansıtma kullanarak):

1. bottom_navigation_menu.xml dosyasından başlıkları boş olarak ayarlayın.

2. BottomNavigationView'ı genişletir:

    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. Bu customView layout.xml dosyasına ekleyin

Daha fazla ayrıntı için bunu Github'da uyguladım


Yansıma kullanmaya gerek yok, her birini menü öğeleri kimlikleri ile BottomNavigationItemViewarayarak elde edebilirsiniz findViewById()(aynen @NikolaDespotoski'nin cevabında yaptığı gibi ).
Fred Porciúncula

1
Artık etiketleri kaldırmayı destekliyorlarapp:labelVisibilityMode="unlabeled"
Amjad Alwareh

13

1. Set android:title="";içinde menü / abc.xml

2. Yansımayı kullanan aşağıdaki yardımcı sınıfı oluşturun

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. Ana aktivitenize şu satırları ekleyin:

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

11

Yansımasız yaklaşım:

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
Nasıl metin yerine simge kaldırmak istiyorsanız ilgili
Merhawi Fissehaye

Varsayılan BottomNavigation kodunun zaten mevcut olduğu ana aktivitede bunu nasıl çağırabilirim? @NikolaDespotoski
TiagoIB

@TiagoIB sadece yöntemi statik hale getirir ve başka bir sınıfa taşır. Veya onu özel tutun ve belirtilen bağımsız değişkenlerle çağırın.
Nikola Despotoski

Affedersiniz ama bunu koduma nasıl ekleyebilirim? prntscr.com/he03j7 @NikolaDespotoski
TiagoIB

6

Bu geçici bir çözümdür. Sadece ekleyin: app:itemTextColor="@android:color/transparent"Bu, arka plan rengi ne olursa olsun devre dışı görünmesini sağlar. Simgenin yüksek görünmesini sağlar.


2

Hem vardiya animasyonunu hem de etiketleri kaldırmak istedim ve buradaki çözümlerin hiçbiri benim için işe yaramadı, işte burada öğrendiğim her şeyi temel alarak oluşturduğum çözüm:

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

Sadece bu yöntemi özel ürününüze ekleyin BottomNavigationViewve menü öğelerinin kimliklerini geçirme olarak adlandırın.


1

Sanf0rd'ın cevabında verdiği gibi bunu kendiniz uygulamanızı tavsiye ederim . Ama AppCompatImageViewbenim için çalışmıyor. Olarak değiştirdim ImageView. Ve değişmiş getChildAtiçin findViewById.

Ayrıca seçilmemiş öğelerin tüm etiketlerini gizlerim.

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);
        }
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.