Google, BottomNavigationView ile yeni destek kitaplığı v25'i yayınladı
öğe etiketlerini kaldırmanın bir yolu var mı?
layout_marginBottom="-16dp"
bu dolguyu kaldıracak ancak tüm görünümü küçültecektir.
android:paddingTop="8dp" android:layout_marginBottom="-8dp"
Bu, çubuğun küçülmesini engeller
Yanıtlar:
Bu stili ister miydin?
Öyleyse, BottomNavigationViewEx'i denemenizi tavsiye ederim .
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
BottomNavigationItemView
arayarak elde edebilirsiniz findViewById()
(aynen @NikolaDespotoski'nin cevabında yaptığı gibi ).
app:labelVisibilityMode="unlabeled"
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);
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());
}
}
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 BottomNavigationView
ve menü öğelerinin kimliklerini geçirme olarak adlandırın.
Sanf0rd'ın cevabında verdiği gibi bunu kendiniz uygulamanızı tavsiye ederim . Ama AppCompatImageView
benim için çalışmıyor. Olarak değiştirdim ImageView
. Ve değişmiş getChildAt
iç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);
}
}
}
title
Menülerden<item>
s çıkarmayı denediniz mi?