Xóa nhãn BottomNavigationView


82

Google đã phát hành thư viện hỗ trợ mới v25 với BottomNavigationView

nhập mô tả hình ảnh ở đây

có cách nào để loại bỏ nhãn mục?


1
Bạn đã thử xóa titles khỏi menu <item>s chưa?
Mike M.

8
Sau khi xóa tiêu đề, có thêm phần đệm bên dưới các biểu tượng. Việc thêm layout_marginBottom="-16dp"sẽ loại bỏ vùng đệm này nhưng sẽ làm cho tất cả chế độ xem nhỏ hơn.
dzikovskyy

Bạn có thể thay vì đặt lề, đặt chiều cao tùy chỉnh và thêm một số phần đệm bổ sung lên trên cùng. Bằng cách đó, bạn có thể căn giữa các biểu tượng.
Bolling

4
Tôi chỉ cố định nó như thế này: android:paddingTop="8dp" android:layout_marginBottom="-8dp" ngăn chặn này thanh từ việc nhỏ
Palm

Câu trả lời:


198

Tôi hy vọng tôi không quá muộn để đến bữa tiệc ở đây.

Nhưng kể từ Thư viện hỗ trợ thiết kế 28.0.0-alpha1, bạn có thể sử dụng thuộc tính

app:labelVisibilityMode="unlabeled"

BottomNavigationView không có nhãn

bạn cũng có thể sử dụng các giá trị khác "tự động", "có nhãn" và "đã chọn".


thư viện hỗ trợ nào? v7 hay thiết kế?
Sagar Maiyad

thư viện hỗ trợ thiết kế 28.0.0
Abdul-Aziz-Niazi

tính năng đang chờ đợi nhất.
bikram

1
Bạn viết cái này ở lớp nào?
Explorex

1
@Explorex Đây là chế độ xem điều hướng dưới cùng của android và các thuộc tính tôi đã đề cập là thuộc tính xml của lớp đã nói được sử dụng trong thẻ xml của chế độ xem đã nói. bạn có thể sử dụng nó trong mã quá developer.android.com/reference/com/google/android/material/...
Abdul-Aziz-Niazi

21

Bạn có muốn phong cách này không?

Nếu vậy, tôi khuyên bạn nên thử BottomNavigationViewEx .


Tôi không thích thư viện này. nó làm cho vị trí biểu tượng bị thay đổi khi được nhấp vào và không có cách nào để làm cho vị trí biểu tượng được cố định khi nhấp vào.
Dika

18

Thật không may, phiên bản BottomNavigationView đầu tiên này có rất nhiều hạn chế. Và hiện tại, bạn không thể xóa tiêu đề chỉ bằng cách sử dụng API thiết kế hỗ trợ. Vì vậy, để giải quyết hạn chế này trong khi google không triển khai nó, bạn có thể làm (sử dụng phản chiếu):

1. Đặt tiêu đề trống trong tệp bottom_navigation_menu.xml.

2. Mở rộng 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. Thêm vào layout.xml customView này

Để biết thêm chi tiết, tôi đã triển khai điều này trên Github


Không cần sử dụng phản chiếu, bạn có thể nhận được từng thứ BottomNavigationItemViewbằng cách gọi findViewById()với id các mục trong menu (giống như @NikolaDespotoski đang làm trong câu trả lời của anh ấy ).
Fred Porciúncula

1
Họ hỗ trợ xóa nhãn hiện nayapp:labelVisibilityMode="unlabeled"
Amjad Alwareh

13

1. Đặt android:title="";trong menu / abc.xml

2. Tạo lớp trợ giúp bên dưới sử dụng phản xạ

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. Trong hoạt động chính của bạn, hãy thêm những dòng sau:

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

11

Cách tiếp cận không phản ánh:

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
Làm thế nào về nếu tôi muốn loại bỏ biểu tượng thay cho văn bản
Merhawi Fissehaye

Làm cách nào để gọi điều này trong hoạt động chính đã tồn tại mã BottomNavigation mặc định? @NikolaDespotoski
TiagoIB

@TiagoIB chỉ làm cho phương thức tĩnh và chuyển nó sang một số lớp khác. Hoặc giữ nó ở chế độ riêng tư và gọi nó với các đối số được chỉ định.
Nikola Despotoski

Xin lỗi, nhưng làm thế nào tôi có thể chèn nó vào mã của mình? prntscr.com/he03j7 @NikolaDespotoski
TiagoIB

6

Đây là một sửa chữa tạm thời. Chỉ cần thêm: app:itemTextColor="@android:color/transparent"Điều đó sẽ làm cho nó bất kể màu nền là gì, có vẻ như bị vô hiệu hóa. Nó làm cho biểu tượng trông cao hơn.


2

Tôi muốn xóa cả hoạt ảnh shift và nhãn và không có giải pháp nào ở đây hoạt động tốt với tôi, vì vậy đây là giải pháp tôi đã xây dựng dựa trên mọi thứ tôi học được ở đây:

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

Chỉ cần thêm phương thức này vào tùy chỉnh của bạn BottomNavigationViewvà gọi nó chuyển id của các mục menu.


1

Tôi khuyên bạn nên tự mình thực hiện nó như sanf0rd đã đưa ra trong câu trả lời của anh ấy . Nhưng AppCompatImageViewkhông làm việc cho tôi. Tôi đã thay đổi nó thành ImageView. Và đổi getChildAtthànhfindViewById .

Ngoài ra, tôi ẩn tất cả các nhãn của các mục không được chọn.

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);
        }
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.