Google đã phát hành thư viện hỗ trợ mới v25 với BottomNavigationView
có cách nào để loại bỏ nhãn mục?
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.
android:paddingTop="8dp" android:layout_marginBottom="-8dp"
ngăn chặn này thanh từ việc nhỏ
Câu trả lời:
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 .
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
BottomNavigationItemView
bằ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 ).
app:labelVisibilityMode="unlabeled"
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);
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());
}
}
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 BottomNavigationView
và gọi nó chuyển id của các mục menu.
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 AppCompatImageView
không làm việc cho tôi. Tôi đã thay đổi nó thành ImageView
. Và đổi getChildAt
thà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);
}
}
}
title
s khỏi menu<item>
s chưa?