नीचे दिए गए सभी समय पर चिह्न और पाठ लेबल दोनों प्रदर्शित करें


125

मैं डिजाइन समर्थन पुस्तकालय संस्करण 25 से android.support.design.widget.BottomNavigationView का उपयोग कर रहा हूं

compile 'com.android.support:design:25.0.0'

<android.support.design.widget.BottomNavigationView
        android:id="@+id/bottomBar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_gravity="center"
        app:itemBackground="@color/colorPrimary"
        app:menu="@menu/bottom_navigation_main"
        android:forceHasOverlappingRendering="true"/>

जब @ मेनू / bottom_navigation_main में केवल तीन क्रियाएं होती हैं, तो यह हर समय आइकन और पाठ लेबल दोनों प्रदर्शित करता है।

जब तीन से अधिक क्रियाएं हों, तो हर समय आइकन और टेक्स्ट लेबल दोनों प्रदर्शित करने का तरीका क्या है।


आपके बॉटम_navigation_main.xml मेनू में, अगर आपके पास Android है: showAsAction = "ifRoom" इसे एंड्रॉइड में बदलें: प्रत्येक आइटम के लिए showAsAction = "हमेशा"।
शशांक उडुपा

नहीं, यह काम नहीं किया। मैंने पहले भी इसे आजमाया था।
एंड्रॉइड डेवलपर

क्या आप अपना मेनू xml फ़ाइल दिखा सकते हैं
शशांक उडुपा

'<? xml संस्करण = "1.0" एन्कोडिंग = "utf-8"?> <मेनू xmlns: android = " schemas.android.com/apk/res/android " xmlns: app = " schemas.android.com/kk/ रेस-ऑटो "> <आइटम Android: id =" @ id / action_favorites "ऐप: showAsAction =" हमेशा "/> <आइटम android: id =" @ id / action_schedules "ऐप: showAsAction =" हमेशा "/> <" आइटम android: id = "@ id / action_music" ऐप: showAsAction = "हमेशा" /> <आइटम android: id = "@ + आईडी / खाता" Android: सक्षम = "सही" ऐप: showAsAction = "हमेशा" /> </ मेनू> '
Android डेवलपर

4
जगह ऐप: लेबलविजिबिलिटी एमओडीई = बॉटम नॉनविजिव व्यू में "लेबल"।
श्रावण

जवाबों:


327

किसी के लिए अभी भी एक समाधान की तलाश में है और तीसरे पक्ष के पुस्तकालयों या रनटाइम प्रतिबिंब पर भरोसा नहीं करना चाहता है, समर्थन लाइब्रेरी 28 / Jetpack में नीचेNavigationView मूल रूप से हमेशा टेक्स्ट लेबल होने का समर्थन करता है।

यह वह विधि है जिसकी आप तलाश कर रहे हैं।

या एक्सएमएल में, app:labelVisibilityMode="labeled"


मुझे किस लाइब्रेरी संस्करण की आवश्यकता है?
डेनिलोडेक्यूवेइरोज़

समर्थन पुस्तकालय 28-अल्फा 1 +
शशगांधी

केवल प्रेस / फोकस होने पर आइकन-टेक्स्ट दिखाने के लिए आप दृश्यता मोड को "ऑटो" में भी बदल सकते हैं। कोड: app: labelVisibilityMode = "ऑटो"
केनी डाबरी

आप आदमी हो! धन्यवाद, यह सामग्री लाइब्रेरी के नवीनतम संस्करण के साथ काम करता है।
सूद

68

8 मई, 2018 से अद्यतन

आप उपयोग कर सकते हैं app:labelVisibilityMode="labeled" सीधे में<android.support.design.widget.BottomNavigationView />

स्रोत: https://developer.android.com/reference/com/google/android/material/bottomnavigation/LabelVisibilityMode

इस लंबे समाधान के नीचे की जरूरत नहीं है।

प्रीवियस ANSWER

मेरा बॉटमवेशन व्यू के साथ कुछ अजीब व्यवहार था। जब मैं इसमें किसी भी आइटम / टुकड़े का चयन कर रहा था, तो टुकड़ा नीचे को नीचे की ओर धकेलता है। इसलिए नीचे का पाठ स्क्रीन के नीचे चला जाता है, इसलिए केवल चिह्न दिखाई देते थे और पाठ किसी भी वस्तु पर क्लिक करने पर छिप जाता है।

यदि आप उस अजीब व्यवहार का सामना कर रहे हैं तो यहाँ समाधान है। जरा हटाओ

android:fitsSystemWindows="true"

टुकड़े के अपने मूल लेआउट में। जरा इसे हटाओ और उछालो! BottomNavigationView ठीक काम करेगा, अब इसे टेक्स्ट और आइकन के साथ दिखाया जा सकता है। मैं अपने मूल में यह था टुकड़े के CoordinatorLayout।

इसके अलावा जोड़ना मत भूलना

BottomNavigationViewHelper.removeShiftMode(bottomNavigationView);

अपनी गतिविधि में शिफ्टिंग मोड को निष्क्रिय करने के लिए।

यहाँ वह वर्ग है:

public class BottomNavigationViewHelper {

    @SuppressLint("RestrictedApi")
    public static void removeShiftMode(BottomNavigationView view) {
        //this will remove shift mode for bottom navigation 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);
                item.setShiftingMode(false);
                // set once again checked value, so view will be updated
                item.setChecked(item.getItemData().isChecked());
            }

        } catch (NoSuchFieldException e) {
            Log.e("ERROR NO SUCH FIELD", "Unable to get shift mode field");
        } catch (IllegalAccessException e) {
            Log.e("ERROR ILLEGAL ALG", "Unable to change value of shift mode");
        }
    }
}

STAR_ZERO के जवाब के संयोजन में इसने मेरी समस्या हल कर दी!
क्रिस्टोफर स्मिट

आपके पास कॉल में disableShiftMode, और कक्षा में removeShiftMode। उस छोटी सी विसंगति के अलावा आपके उत्तर ने मेरे लिए समस्या हल कर दी। अब मेरे पास बिना शिफ्टिंग के और टेक्स्ट + आइकन के साथ पाँच मेनू हैं। बहुत बहुत धन्यवाद !
यमकजुरे

उत्तम। जब आपके नीचे नेविगेशन में 3 से अधिक आइटम होते हैं, तो एक स्थानांतरण मोड दिखाई देता है। इसका उपयोग करके, आप उस स्थानांतरण को अक्षम कर सकते हैं और इसलिए पाठ के सभी चिह्न एक साथ दिखाई देते हैं।
किशोर बिक्रम ओली

1
यह अप्रतिबंधित एपीआई है, और यह समर्थन लाइब्रेरी संस्करण 28 पर काम नहीं करता है। +। @Shaishgandhi के उत्तर को स्वीकार करना अधिक उचित तरीका है।
ओकाकोज

19

यह संस्करण 25 में मुश्किल है।

इस कोड को आज़माएं। लेकिन मुझे लगता है कि यह अच्छा समाधान नहीं है।

BottomNavigationView navigationView = (BottomNavigationView) findViewById(R.id.bottomBar);
BottomNavigationMenuView menuView = (BottomNavigationMenuView) navigationView.getChildAt(0);
for (int i = 0; i < menuView.getChildCount(); i++) {
    BottomNavigationItemView itemView = (BottomNavigationItemView) menuView.getChildAt(i);
    itemView.setShiftingMode(false);
    itemView.setChecked(false);
}

एंड्रॉइड स्टूडियो में, इस तरह से कोड जोड़ना चाहिए: `` // noinspection RestrictedApi itemView.setShiftingMode (false); // noinspection प्रतिबंधित Api itemView.setChecked (झूठा); `` `
Jiezhi.G

4
यह अभी भी आइटम शिफ्ट है
कोडटॉइल

1
उत्तम !! आइकन और पाठ दोनों को प्रदर्शित करता है। लेकिन शिफ्टिंग मोड (झूठा) काम नहीं कर रहा है।
मिंकू

KishanSolanki124 के जवाब के साथ संयोजन ने मेरे मुद्दे को हल कर दिया!
क्रिस्टोफर स्मिट

11

यहां एक कोटलिन एक्सटेंशन फ़ंक्शन है जो @STAR_ZERO और @ KishanSolanki124 के समाधान को जोड़ती है।

fun BottomNavigationView.disableShiftMode() {
    val menuView = getChildAt(0) as BottomNavigationMenuView

    menuView.javaClass.getDeclaredField("mShiftingMode").apply {
        isAccessible = true
        setBoolean(menuView, false)
        isAccessible = false
    }

    @SuppressLint("RestrictedApi")
    for (i in 0 until menuView.childCount) {
        (menuView.getChildAt(i) as BottomNavigationItemView).apply {
            setShiftingMode(false)
            setChecked(false)
        }
    }
}

इसके प्रयेाग के लिए:

myBottomNavigation.disableShiftMode()

10

क्या आप इस प्रभाव को चाहते हैं?

छवि देखने के लिए यहां क्लिक करें

यदि हां, तो मैं कोशिश करने के लिए आप की सिफारिश की BottomNavigationViewEx


1
आपका पुस्तकालय अच्छा और प्रभावशाली काम है, लेकिन मैं डिजाइन लाइब्रेरी 25.0.0 का उपयोग करके इस कार्यक्षमता को प्राप्त करना चाहता था। दुर्भाग्य से यह एंड्रॉइड डिजाइन अभ्यास के खिलाफ है
Android डेवलपर

यह डॉक्स में "फिक्स्ड बॉटम नेविगेशन बार" के अनुसार, मटीरियल डिज़ाइन स्पेक्स के खिलाफ नहीं है । साथ ही, इस भयानक पुस्तकालय को साझा करने के लिए मेरा व्यक्तिगत धन्यवाद।
सर्ग डे एडेलैंटाडो

1
यह मैटेरियल डिज़ाइन स्पेक्स के विरुद्ध है। यदि आप अपने द्वारा प्रदान किए गए दस्तावेज़ को पढ़ते हैं, तो आप देखेंगे कि यह स्पष्ट रूप से कहता है "यदि चार या पांच क्रियाएं हैं, तो केवल आइकन के रूप में निष्क्रिय दृश्य प्रदर्शित करें"।
फेलिप

8

आप इसका उपयोग टेक्स्ट और आइकॉन दोनों के लिए बॉटमएनविजिव व्यू पर दिखा सकते हैं

app:labelVisibilityMode="labeled"

यदि आप इसका उपयोग कर रहे हैं तो आप आइकन और टेक्स्ट दोनों को देख पाएंगे

<android.support.design.widget.BottomNavigationView
    app:labelVisibilityMode="labeled"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/bottom_navigation_view"
    android:layout_alignParentBottom="true"
    app:menu="@menu/bottom_navigation_menu"/>

6

आप सीधे ऐप का उपयोग कर सकते हैं: labelVisibilityMode = "लेबल" में सीधे

<com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/bottom_navigation"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        app:labelVisibilityMode="labeled"
        android:elevation="8dp"
        android:layout_alignParentBottom="true"
        app:itemBackground="@drawable/bottom_navi"
        app:itemTextColor="@color/white"
        app:itemIconTint="@color/white"
        app:menu="@menu/bottom_nav_menu_managment" />

5

बॉटम नोविजिविज्यू क्लास में एक बॉटनैविजिमेन्यू व्यू फील्ड होता है और बॉटमनेविमेन्समेन्यू व्यू में एक बॉटनैविजिमिटीव्यू व्यू [] फील्ड होता है, जो बॉटम बार में आइटम होता है।

कहें कि n आइटमों की संख्या है, BottomNavigationMenuView, निचलाअनुभव ItemView [] एरे के प्रत्येक सदस्य पर निचलाNavigationItemView.setShiftingMode (n> 3) को कॉल करेगा। यह फ़ंक्शन व्यवहार तय करता है (हमेशा या केवल चयन पर शीर्षक दिखाएं)।

इसलिए शीर्षकों को हमेशा दिखाने का तरीका इस पद्धति को कॉल करने का प्रयास करना है और आप निजी क्षेत्रों तक पहुंचने के लिए प्रतिबिंब का उपयोग कर सकते हैं।

    BottomNavigationView bottomNavigationView= (BottomNavigationView) findViewById(R.id.bottom_navigation);


//  get the private BottomNavigationMenuView field 
        Field f = null;
        try {
            f = bottomNavigationView.getClass().getDeclaredField("mMenuView");
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
        f.setAccessible(true);
        BottomNavigationMenuView menuView=null;
        try {
             menuView = (BottomNavigationMenuView) f.get(bottomNavigationView); 
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

//  get the private BottomNavigationItemView[]  field 
        try {
            f=menuView.getClass().getDeclaredField("mButtons");
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
        f.setAccessible(true);
        BottomNavigationItemView[] mButtons=null;
        try {
            mButtons = (BottomNavigationItemView[]) f.get(menuView); 
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }


        for(int i=0;i<mButtons.length;i++){
            mButtons[i].setShiftingMode(false);
            mButtons[i].setChecked(true);
        }

यह बहुत अच्छा है, बस हमें यह सुनिश्चित करने की आवश्यकता है कि बॉटनवेशनमेनु व्यू भी शिफ्ट न हो। -> f = menuView.getClass ()। getDeclaredField ("mShiftingMode"); f.setAccessible (सही); f.setBoolean (menuView, false);
स्टीफन के।

4

सभी तरह से खिताब दिखाने के लिए। इस कोटलिन कोड का प्रयास करें:

@SuppressLint("RestrictedApi")
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_ofree)

    navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener)

    val menuView = navigation.getChildAt(0) as BottomNavigationMenuView
    for (i in 0 until menuView.childCount) {
        val itemView = menuView.getChildAt(i) as BottomNavigationItemView
        itemView.setShiftingMode(false)
        itemView.setChecked(false)
    }
}

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