3 से अधिक आइटम: निचला शीर्षक छिपा हुआ है


85

मैं एंड्रॉइड सपोर्टिंग लाइब्रेरी 25 का उपयोग करने के साथ नीचे का उपयोग कर रहा हूं। लेकिन जब मैं टैब स्विच करता हूं, तो दूसरे टैब का शीर्षक छुपा होता है। लेकिन वास्तविक बॉटम नेवीगेशन व्यू को कोई छिपा हुआ मुद्दा नहीं है। लेकिन मेरा तो छिपा है।

MyBottomNavigation

लेकिन मैं इसे वैसा ही देखना चाहता हूं। ऐसा करने के लिए कोई विचार? मैं क्या खो रहा हूँ?

ActualBottomNavigation

यहाँ मेरा कोड है:

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.yunus.ototakip.MainActivity">

<FrameLayout
    android:id="@+id/main_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_above="@+id/bottom_navigation"
    android:layout_alignParentTop="true">
</FrameLayout>

<android.support.design.widget.BottomNavigationView
    android:id="@+id/bottom_navigation"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    app:itemBackground="@color/colorPrimary"
    app:itemIconTint="@color/beyaz"
    app:itemTextColor="@color/beyaz"
    app:menu="@menu/bottombar_menu" />

bottom_bar_menu.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
 <item
android:id="@+id/bb_menu_arac"
android:enabled="true"
android:icon="@drawable/icon_car"
android:title="@string/araclarim"
app:showAsAction="ifRoom" />
 <item
android:id="@+id/bb_menu_yakin"
android:enabled="true"
android:icon="@drawable/icon_yer"
android:title="@string/yakinimdakiler"
app:showAsAction="ifRoom" />
  <item
android:id="@+id/bb_menu_yaklasan"
android:enabled="true"
android:icon="@drawable/icon_takvim"
android:title="@string/yaklasanlar"
app:showAsAction="ifRoom" />

<item
    android:id="@+id/bb_menu_ipucu"
    android:enabled="true"
    android:icon="@drawable/icon_ipucu"
    android:title="@string/ipuclari"
    app:showAsAction="ifRoom" />
 </menu>

क्या आपने app:showAsAction="alwaysइसके बजायifRoom
यासीन बीईएलडीआई

मैंने कोशिश की, लेकिन यह अभी भी छिपा हुआ है
यूनुस हेजदार

1
यहाँ पर देखें stackoverflow.com/questions/36032177/…
Yassine BELDI

1
@ यूनुसहजेदर अगर आइटम 3 से अधिक है तो टेक्स्ट हमेशा छुप जाएगा ...
शशांक वर्मा

1
अरे, @DanXPrado समाधान साझा करने के लिए धन्यवाद। मैंने आपका उत्तर स्वीकार कर लिया है। खुश कोडिंग।
यूनुस हेजदार 12

जवाबों:


139

प्रतिबिंब का उपयोग करने वाला समाधान अब काम नहीं करता है क्योंकि फ़ील्ड mShiftingMode को हटा दिया गया था।

अब इसे करने का एक आसान तरीका है: समर्थन लाइब्रेरी 28 का उपयोग करें और बस app:labelVisibilityMode="labeled"अपने BottomNavigationViewXML घोषणा में जोड़ें ।

आशा करता हूँ की ये काम करेगा।


शैंपू की तरह काम करना, लेकिन इसे गोलाकार कैसे बनाया जा सकता है?
शैलेंद्र मद्दा

@ShylendraMadda मैं आपको सुझाव देता हूं कि इस प्रश्न से संबंधित नहीं है क्योंकि यह एक नया प्रश्न है।
डेनिलो प्राडो

1
यह कैसे डिफ़ॉल्ट व्यवहार नहीं है ... मैंने ऐप के साथ कुछ घंटे बर्बाद किए: showAsAction, android: दृश्यमान, Android: सक्षम और अन्य हैक का एक गुच्छा। धन्यवाद!
दानिश खान

94

अपडेट करें

removeShiftMode () की अब आवश्यकता नहीं है, क्योंकि समर्थन पुस्तकालय 28.0.0-अल्फा 1 में अब हम लेबल जोड़ सकते हैं ।

XML में:

<android.support.design.widget.BottomNavigationView
    app:labelVisibilityMode="labeled" />

प्रोग्राम परिवर्तन के लिए:

mBottomNavigationView.setLabelVisibilityMode(LabelVisibilityMode.LABEL_VISIBILITY_LABELED); 

इसके लिए काम करने के लिए: डिज़ाइन समर्थन लाइब्रेरी को 28.0.0-Alpha1 पर अपडेट करें

यहाँ एक अच्छा पढ़ा है

पुराने समर्थन पुस्तकालय के लिए:

अपने में bottom_bar_menu.xmlshowAsActionविशेषता बदलें

<item android:id="@id/menu_item"
android:title="text"
android:icon="@drawable/drawable_resource_name"
android:showAsAction="always|withText" />

बिल्ड में .ग्रेड:

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

3 से अधिक आइटम: नेविगेशन removeShiftMode()विधि का उपयोग करें

में BottomNavigationViewHelper.javaउपयोग:

import android.annotation.SuppressLint;
import android.support.design.internal.BottomNavigationItemView;
import android.support.design.internal.BottomNavigationMenuView;
import android.support.design.widget.BottomNavigationView;
import java.lang.reflect.Field;

    public class BottomNavigationViewHelper {
        @SuppressLint("RestrictedApi")
        public static void removeShiftMode(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);
                    // set once again checked value, so view will be updated
                    //noinspection RestrictedApi
                    item.setChecked(item.getItemData().isChecked());
                }
            } catch (NoSuchFieldException e) {
                Log.e("BottomNav", "Unable to get shift mode field", e);
            } catch (IllegalAccessException e) {
                Log.e("BottomNav", "Unable to change value of shift mode", e);
            }
        }
    }

इसका उपयोग करके कॉल करें:

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

यह शीर्षक पाठ के शिफ्ट एनीमेशन को निष्क्रिय कर देगा और पाठ को प्रदर्शित करने में सक्षम करेगा।


2
नहीं, यह अभी भी छिपा हुआ है। मैंने "हमेशा" और "हमेशा | withText" की कोशिश की
यूनुस हज़ेदार

1
उर आइटम शीर्षक में से एक बड़ा है दूसरे के दृश्य को अवरुद्ध करने का कारण है? छोटे शीर्षक और
आकर्षक

1
इस पंक्ति को It’s important to note that the maximum number of items we can display is 5. This may change at any point, so it’s important to check this by using the getMaxItem() method provided by the BottomNavigationView class rather than hard-coding the value yourself.
टुटोरियल पर देखें

1
शानदार जवाब, धन्यवाद
हमजा अब्दुल्ला

2
प्रतिबिंब समाधान बहुत अच्छी तरह से काम करता है com.android.support:design:25.4.0, लेकिन विफल रहता है com.android.support:design:26.1.0, इसलिए मैं लक्ष्य एसडीके और निर्भरता के संस्करण को थोड़ा पीछे करता हूं।
इवी सांग

10

निचला स्रोत के स्कैन कोड के बाद मुझे लगता है

mShiftingMode = mMenu.size() > 3;

में BottomNavigationMenuView.java लाइन 265, इसका मतलब है, जबकि मेनू आकार की तुलना में अधिक 3, टैब शीर्षक hid हो wiil। इसलिए यदि आप टैब शीर्षक दिखाना चाहते हैं तो आपको केवल बिल्ड से कोड प्राप्त करने और नीचे बदलने की आवश्यकता है।

mShiftingMode = mMenu.size() > 5;

PS: BottonNavigationView अधिकतम टैब संख्या 3 और 5 के बीच होनी चाहिए। आप नीचे दिए गए कोड पर देख सकते हैं यहां छवि विवरण दर्ज करें


मेरे पास अपना स्वयं का CustomBottomView है, जो कि निचला-न्यूगेशन व्यू बढ़ाता है, क्या इसके बजाय उस संपत्ति को सेट करने का कोई तरीका है?
JPM

1
मैं 3 टैब की सीमा के बारे में "बॉटमवेशनमेनेन व्यू" की लाइन नहीं देखता। शायद कोड बदल गया है?
Android डेवलपर

8

क्लास बॉटमएनावेशन व्यू हेल्पर बनाएं

import android.annotation.SuppressLint;
import android.support.design.internal.BottomNavigationItemView;
import android.support.design.internal.BottomNavigationMenuView;
import android.support.design.widget.BottomNavigationView;
import android.util.Log;
import java.lang.reflect.Field;
public class BottomNavigationViewHelper {
    @SuppressLint("RestrictedApi")
    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);
if(menuView.getChildCount()<6)
           {
            for (int i = 0; i < menuView.getChildCount(); i++) {
                BottomNavigationItemView item = (BottomNavigationItemView) menuView.getChildAt(i);
                //noinspection RestrictedApi
                item.setShiftingMode(false);
                // 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);
        }
    }
}   

कॉल

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

1
इसमें SuppressLint है जो प्रतिबंधात्मक समस्या निवारण समस्या को हल करता है
कोड

3

कोटलिन विस्तार समारोह:

@SuppressLint("RestrictedApi")
fun BottomNavigationView.removeShiftMode(){
    val menuView = this.getChildAt(0) as BottomNavigationMenuView
    try {
        val shiftingMode = menuView.javaClass.getDeclaredField("mShiftingMode")
        shiftingMode.isAccessible = true
        shiftingMode.setBoolean(menuView, false)
        shiftingMode.isAccessible = false
        for (i in 0 until menuView.childCount) {
            val item = menuView.getChildAt(i) as BottomNavigationItemView
            item.setShiftingMode(false)
            // set once again checked value, so view will be updated
            item.setChecked(item.itemData.isChecked)
        }
    } catch (e: NoSuchFieldException) {
        e.printStackTrace()
        Timber.tag("BottomNav").e( e, "Unable to get shift mode field")
    } catch (e: IllegalAccessException) {
        Timber.tag("BottomNav").e( e, "Unable to change value of shift mode")
    }
}

धन्यवाद महोदय। बहुत ही सराहनीय।
यूनुस हेजदार

1
item.setShiftingMode(false)अब हैitem.setShifting(false)
सिम

2

मैं बहुत अधिक rafsanahmad007 उत्तर का उपयोग करता हूं, लेकिन इसे कोटलिन में अनुवाद करता हूं । मैं इसे भविष्य के भटकने वालों के लिए साझा करता हूं

@SuppressLint("RestrictedApi")
fun BottomNavigationView.disableShiftMode() {
    val menuView = this.getChildAt(0) as BottomNavigationMenuView
    try {
        val shiftingMode = menuView::class.java.getDeclaredField("mShiftingMode")
        shiftingMode.setAccessible(true)
        shiftingMode.setBoolean(menuView, false)
        shiftingMode.setAccessible(false)
        for (i in 0..(menuView.childCount - 1)) {
            val item = menuView.getChildAt(i) as BottomNavigationItemView
            item.setShiftingMode(false)
            // set once again checked value, so view will be updated
            item.setChecked(item.getItemData().isChecked())
        }
    } catch (e: NoSuchFieldException) {
        Timber.e("Unable to get shift mode field")
    } catch (e: IllegalAccessException) {
        Timber.e("Unable to change value of shift mode")
    }
}

1
यह समाधान अब मान्य नहीं है, स्वीकृत समाधान @DanXPrado द्वारा सही है
jpardogo

मुझे जानने के लिए Thx
कर्मा मेकर

0

यह मेरे लिए एपीआई 26 में काम करता है:

 navigation = (BottomNavigationView) view.findViewById(R.id.bottom_navigation);


     try{disableShiftMode(navigation);}catch(Exception ew){}

इस गतिविधि को अपनी गतिविधि या फ़्रैगमेंट में बनाएं जहाँ आप कॉल करना चाहते हैं:

 @SuppressLint("RestrictedApi")
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);
            item.setShiftingMode(false);

            item.setChecked(item.getItemData().isChecked());
        }
    } catch (NoSuchFieldException e) {

    } catch (IllegalAccessException e) {

    }
}

0

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

 app:labelVisibilityMode="labeled"

लेकिन आपको 5 आइटम्स के लिए बॉटलनेविविव्यू पर लंबे टेक्स्ट कटिंग की समस्या का सामना करना पड़ेगा। उसके लिए, मुझे टेक्स्ट की शिफ्टिंग के साथ-साथ बॉटम नेशनव्यू व्यू के आइकन के लिए एक अच्छा समाधान मिला। आप टेक्स्ट को शिफ्ट करने के साथ-साथ आइकॉन ऑन बॉटमनेविजिव व्यू को भी रोक सकते हैं। कोड के स्निपशॉट यहां दिए गए हैं।

1. नीचे दिखाए अनुसार नीचे की ओर कोड की कुछ लाइन जोड़ें

<android.support.design.widget.BottomNavigationView
    android:id="@+id/bottom_navigation"
    android:layout_width="match_parent"
    android:layout_height="@dimen/seventy_dp"
    android:layout_semitransparent="true"
    android:background="@color/colorBottomNev"
    android:showAsAction="always|withText"
    app:itemIconTint="@drawable/bottom_navigation_colors"
    app:itemTextColor="@drawable/bottom_navigation_colors"
    app:itemTextAppearanceActive="@style/BottomNavigationViewTextStyle"
    app:itemTextAppearanceInactive="@style/BottomNavigationViewTextStyle"
    app:menu="@menu/bottom_navigation_menu"
    app:labelVisibilityMode="labeled"/>

2. मेनू आइटम को इस प्रकार जोड़ें: -

 <?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <item
        android:id="@+id/action_catalogue"
        android:icon="@drawable/catalogue"
        android:title="@string/catalogue"
        android:enabled="true"
        app:showAsAction="ifRoom" />

    <item
        android:id="@+id/action_contracts"
        android:icon="@drawable/contract"
        android:title="@string/contracts"
        android:enabled="true"
        app:showAsAction="ifRoom" />

    <item
        android:id="@+id/action_prospects"
        android:icon="@drawable/prospect"
        android:title="@string/prospects"
        android:enabled="true"
        app:showAsAction="ifRoom" />

    <item
        android:id="@+id/action_performance"
        android:icon="@drawable/performance"
        android:title="@string/performance"
        android:enabled="true"
        app:showAsAction="ifRoom" />

    <item
        android:id="@+id/action_advance"
        android:icon="@drawable/advance"
        android:title="@string/advance"
        android:enabled="true"
        app:showAsAction="ifRoom" />

</menu>

3. इस शैली को शैली में जोड़ें। xml फ़ाइल:

 <style name="BottomNavigationViewTextStyle">
            <item name="android:fontFamily">@font/montmedium</item>
            <item name="android:textSize">10sp</item>
            <item name="android:duplicateParentState">true</item>
            <item name="android:ellipsize">end</item>
            <item name="android:maxLines">1</item>
        </style>

4) इन्हें डिमेन फोल्डर में जोड़ें

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools">
    <dimen name="design_bottom_navigation_text_size" tools:override="true">10sp</dimen>
    <dimen name="design_bottom_navigation_active_text_size" tools:override="true">10sp</dimen>
</resources>

मुझे इन लिंक और लिंक से मदद मिली। आप इन लिंक का अध्ययन करके भी सहायता प्राप्त कर सकते हैं। यह मुझे बहुत मदद करता है। यह आपकी मदद भी करता है। धन्यवाद....


0

त्वरित फिक्स्ड बस ऐप जोड़ें: लेबलविजबिलिटी मोड = xml में "लेबल"

<android.support.design.widget.BottomNavigationView
    android:id="@+id/bottom_navigation"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    app:itemBackground="@color/colorPrimary"
    app:itemIconTint="@drawable/bottom_navigation_color_selector"
    app:itemTextColor="@drawable/bottom_navigation_color_selector"
    app:labelVisibilityMode="labeled"
    app:menu="@menu/menu_bottom_navigation" />

ध्यान दें

  implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support:design:28.0.0'
implementation 'com.android.support:support-v4:28.0.0'

0

एक बात पर ध्यान दें, हालांकि यह इस मामले में लागू नहीं होता है।

इस पैटर्न का उपयोग तब किया जा सकता है जब आपके पास नेविगेट करने के लिए 3 और 5 शीर्ष-स्तरीय गंतव्यों के बीच हो।

निम्नलिखित करने के लिए आइकन शीर्षक को सक्षम करने के लिए:

  1. सुनिश्चित करें कि आपका मेनू (bottom_navigation_menu) आइटम XML निम्नानुसार संरचित है: -

    <item
        android:id="@+id/action_home"
        android:enabled="true"
        android:icon="@drawable/ic_action_home"
        android:title="HOME"
        app:showAsAction="ifRoom"/>
    
    <item
        android:id="@+id/action_favourites"
        android:enabled="true"
        android:icon="@drawable/ic_action_favourite"
        android:title="FAVOURITES"
        app:showAsAction="ifRoom"/>
    
    <item
        android:id="@+id/action_basket"
        android:enabled="true"
        android:icon="@drawable/ic_action_basket"
        android:title="BASKET"
        app:showAsAction="ifRoom"/>
    

  2. नीचे दिए गए बॉटम-न्यूसेंस व्यू कोड ऐप में जोड़ें: labelVisibilityMode = "लेबल"

<com.google.android.material.bottomnavigation.BottomNavigationView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom"
    android:background="@android:color/white"
    app:itemIconTint="@android:color/black"
    app:itemTextColor="@android:color/black"
    app:menu="@menu/bottom_navigation_menu"
    app:labelVisibilityMode="labeled"/>

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