निचलाअनुशरण दृश्य लेबल निकालें


85

Google ने बॉटम नॉर्विज़न व्यू के साथ नया सपोर्ट लाइब्रेरी v25 जारी किया

यहां छवि विवरण दर्ज करें

क्या आइटम लेबल हटाने का कोई तरीका है?


1
क्या आपने titleमेनू <item>s से s को हटाने की कोशिश की ?
माइक एम।

8
शीर्षकों को हटाने के बाद माउस के नीचे अतिरिक्त पैडिंग होती है। जोड़ना layout_marginBottom="-16dp"इस पैडिंग को हटा देगा लेकिन सभी दृश्य को छोटा कर देगा।
dzikovskyy

आप मार्जिन सेट करने के बजाय कस्टम ऊंचाई सेट कर सकते हैं और शीर्ष पर कुछ अतिरिक्त पैडिंग जोड़ सकते हैं। इस तरह आप आइकनों को केंद्र में रख सकते हैं।
बोलिंग

4
मैंने इसे इस तरह तय किया: android:paddingTop="8dp" android:layout_marginBottom="-8dp" यह बार को छोटे होने से रोकता है
पाम

जवाबों:


206

मुझे उम्मीद है कि मुझे यहां पार्टी में आने में देर नहीं लगेगी।

लेकिन डिज़ाइन सपोर्ट लाइब्रेरी 28.0.0-अल्फा 1 के रूप में आप संपत्ति का उपयोग कर सकते हैं

app:labelVisibilityMode="unlabeled"

बिना लेबल के नीचेNavigationView

आप अन्य मानों "ऑटो", "लेबल" और "चयनित" का भी उपयोग कर सकते हैं।


कौन सी लाइब्रेरी का समर्थन करें? v7 या डिजाइन?
सागर मैय्यद

डिज़ाइन सपोर्ट लाइब्रेरी 28.0.0
अब्दुल-अज़ीज़-नियाज़ी

सबसे अधिक प्रतीक्षित सुविधा।
बिक्रम

1
आप इसे किस कक्षा में लिखते हैं?
22

1
@Explorex यह एंड्रॉइड का निचला नेविगेशन दृश्य है और मैंने जिन विशेषताओं का उल्लेख किया है, वे उक्त दृश्य के xml टैग में उपयोग किए गए उक्त वर्ग की xml विशेषताएँ हैं। आप इसे कोड में भी उपयोग कर सकते हैं। developer.android.com/reference/com/google/android/material/…
अब्दुल-अजीज-नियाज़ी

22

क्या आप इस शैली को चाहते हैं?

यदि हां, तो मेरा सुझाव है कि आप नीचे दिए गए प्रयास देखें


मुझे यह लाइब्रेरी पसंद नहीं है। जब यह क्लिक किया जाता है तो आइकन स्थिति बदल जाती है और क्लिक करने पर आइकन की स्थिति तय करने का कोई तरीका नहीं बनता है।
डिका

18

दुर्भाग्य से बॉटम नॅनविजर्वेशन का यह पहला संस्करण बहुत सी सीमाओं के साथ आया है। और अब आप केवल समर्थन डिज़ाइन API का उपयोग करके शीर्षक नहीं निकाल सकते। इसलिए इस सीमा को हल करने के लिए जब Google इसे लागू नहीं करता है, तो आप कर सकते हैं (प्रतिबिंब का उपयोग करके):

1. नीचे से रिक्त शीर्षक सेट करें_विभाजन_मेनू। Xml फ़ाइल।

2. नीचे विस्तार दृश्य:

    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. इस customView लेआउट में जोड़ें

अधिक जानकारी के लिए मैंने इसे जीथब पर लागू किया है


प्रतिबिंब का उपयोग करने की आवश्यकता नहीं है, आप मेनू आइटम आईडी के साथ BottomNavigationItemViewकॉल करके प्रत्येक प्राप्त कर सकते हैं findViewById()(जैसे @NikolaDespotoski अपने जवाब में कर रहा है )।
फ्रेड पोरिसुन्कुला

1
वे अब लेबल हटाने का समर्थन करते हैंapp:labelVisibilityMode="unlabeled"
अमजद अलवरेह

13

1. मेनू / abc.xmlandroid:title=""; में सेट करें

2. नीचे दिए गए सहायक वर्ग को बनाएं जो प्रतिबिंब का उपयोग कर रहा है

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. अपनी मुख्य गतिविधि में, इन पंक्तियों को जोड़ें:

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

11

चिंतनहीन दृष्टिकोण:

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
कैसे के बारे में अगर मैं पाठ के बजाय आइकन को दूर करना चाहता हूं
मरवाही फिसेहाइ

मैं इसे मुख्य गतिविधि में कैसे कह सकता हूं, जहां डिफ़ॉल्ट बॉटम नेशनगेशन कोड पहले से मौजूद है? @NikolaDespotoski
टियागोइब

@ टियागोबी सिर्फ विधि को स्थिर बनाता है और इसे किसी अन्य वर्ग में ले जाता है। या इसे निजी रखें और इसे निर्दिष्ट तर्कों के साथ कहें।
निकोला देसपोतोस्की

क्षमा करें, लेकिन मैं इसे अपने कोड में कैसे सम्मिलित कर सकता हूं?prntscr.com/he03j7 @NikolaDespotoski
टियागोइब

6

यह एक अस्थायी सुधार है। बस जोड़ें: app:itemTextColor="@android:color/transparent"यह पृष्ठभूमि का रंग जो कुछ भी है, उसे अक्षम कर देगा। यह आइकन को उन्नत बनाता है।


2

मैं शिफ्ट एनिमेशन और लेबल दोनों को हटाना चाहता था और यहाँ कोई भी समाधान मेरे लिए अच्छा काम नहीं करता था, इसलिए यहाँ मैंने जो कुछ भी सीखा, उसके आधार पर मैंने इसे बनाया:

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

बस इस विधि को अपने रिवाज़ में जोड़ें BottomNavigationViewऔर इसे मेनू आइटम के आईडी को पास करें।


1

मैं इसे अपने आप से लागू करने की सलाह दूंगा क्योंकि उसके जवाब में sanf0rd ने दिया था । लेकिन AppCompatImageViewमेरे लिए काम नहीं कर रहा है। मैंने इसे बदल दिया है ImageView। और बदल getChildAtगया findViewById

इसके अलावा, मैं अचयनित वस्तुओं के सभी लेबल छिपाता हूं।

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);
        }
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.