BottomNavigationView मेनू का शीर्षक नहीं दिखाता है जो निष्क्रिय है।
नीचे मेनू में सभी मेनू तत्वों के शीर्षक कैसे दिखाएं? समस्या यह है कि मेरे मामले में केवल उस तत्व का शीर्षक दिखाया गया है जिस पर क्लिक किया गया है।
BottomNavigationView मेनू का शीर्षक नहीं दिखाता है जो निष्क्रिय है।
नीचे मेनू में सभी मेनू तत्वों के शीर्षक कैसे दिखाएं? समस्या यह है कि मेरे मामले में केवल उस तत्व का शीर्षक दिखाया गया है जिस पर क्लिक किया गया है।
जवाबों:
कार्यान्वयन की BottomNavigationView
स्थिति है: जब 3 से अधिक आइटम हैं तो शिफ्ट मोड का उपयोग करें।
इस समय आप इसे मौजूदा एपीआई के माध्यम से नहीं बदल सकते हैं और शिफ्ट मोड को निष्क्रिय करने का एकमात्र तरीका प्रतिबिंब का उपयोग करना है।
आपको सहायक वर्ग की आवश्यकता होगी:
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 {
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);
// 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);
}
}
}
और फिर disableShiftMode
अपने पर विधि लागू करें BottomNavigationView
, लेकिन याद रखें कि यदि आप अपने कोड से मेनू दृश्य फुला रहे हैं, तो आपको इसे फुलाए जाने के बाद निष्पादित करना होगा।
उदाहरण उपयोग:
BottomNavigationView bottomNavigationView = (BottomNavigationView) findViewById(R.id.bottom_navigation_bar);
BottomNavigationViewHelper.disableShiftMode(bottomNavigationView);
पुनश्च।
याद रखें, आपको हर बार अपने मेनू आइटम बदलने पर इस विधि को निष्पादित करना होगा BottomNavigationView
।
अपडेट करें
आपको प्रॉपर कॉन्फ़िगरेशन फ़ाइल (उदाहरण के लिए proguard-rules.pro) को अपडेट करने की आवश्यकता है, ऊपर प्रतिबिंब का उपयोग करता है और यदि mShiftingMode
क्षेत्र की रक्षा करता है तो यह काम नहीं करेगा ।
-keepclassmembers class android.support.design.internal.BottomNavigationMenuView {
boolean mShiftingMode;
}
इस मुद्दे को इंगित करने और स्निपेट प्रदान करने के लिए धन्यवाद मुहम्मद अल्फ़ाफी ।
अद्यतन २
जैसा कि जोलांडा वेरोफ ने नई सहायता लाइब्रेरी ( 28.0.0-alpha1
) और नई सामग्री घटक लाइब्रेरी ( 1.0.0-beta01
) भी बताई है जो एक सार्वजनिक संपत्ति प्रदान करता है जिसका उपयोग 3 मेनू आइटमों में शिफ्टिंग मोड में हेरफेर करने के लिए किया जा सकता है।
<com.google.android.material.bottomnavigation.BottomNavigationView
...
app:labelVisibilityMode="labeled"
...
/>
मटेरियल कंपोनेंट्स लाइब्रेरी में यह लागू होता है यदि 5 मेनू आइटम हैं।
अद्यतन 3
जैसा कि @ThomasSunderland ने भी बताया, आप शिफ्टिंग एनीमेशन को अक्षम करने के लिए पोस्टफ़िक्स के app:itemHorizontalTranslation="false"
बिना इस प्रॉपर्टी को झूठा सेट कर सकते हैं Enabled
।
आप यहां नीचे के दायित्व को स्टाइल करने के लिए पूर्ण गाइड की जांच कर सकते हैं
समर्थन पुस्तकालय 28.0.0-अल्फा 1 के बाद से :
<android.support.design.widget.BottomNavigationView
app:labelVisibilityMode="labeled" />
app:
नहीं कर रहे हैंandroid:
टेक्स्ट एनीमेशन को डिसेबल करने के लिए आप इसे अपने डिमेंस.एक्सएमएल फाइल में भी इस्तेमाल कर सकते हैं:
<dimen name="design_bottom_navigation_active_text_size">12sp</dimen>
आपको इसे अपने घोषणापत्र में जोड़ने की आवश्यकता हो सकती है:
tools:override="true"
tools:override="true"
<dimen name="design_bottom_navigation_active_text_size" tools:ignore="PrivateResource">12sp</dimen>
अब आप app:labelVisibilityMode="[labeled, unlabeled, selected, auto]"
में उपयोग कर सकते हैं28-alpha
labeled
सभी लेबल दिखाई देंगे।unlabeled
केवल आइकन दिखाएगा।selected
केवल चयनित आइटम और बदलाव आइटम के लिए लेबल दिखाएगा।auto
आपके पास मौजूद वस्तुओं की संख्या के आधार पर लेबल या चयनित का चयन करेगा। 1-3 आइटम के लिए लेबल किया गया और 3+ आइटम के लिए चुना गया।विस्तार समारोह के रूप में कोटलिन में प्रेज़मिसलाव का जवाब
@SuppressLint("RestrictedApi")
fun BottomNavigationView.disableShiftMode() {
val menuView = getChildAt(0) as BottomNavigationMenuView
try {
val shiftingMode = menuView::class.java.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) {
Log.e(TAG, "Unable to get shift mode field", e)
} catch (e: IllegalStateException) {
Log.e(TAG, "Unable to change value of shift mode", e)
}
}
उपयोग (कोटलिन Android एक्सटेंशन के साथ):
bottom_navigation_view.disableShiftMode()
मेरे लिये कार्य करता है
bottomNavigationView.setLabelVisibilityMode(LabelVisibilityMode.LABEL_VISIBILITY_LABELED);
या
<android.support.design.widget.BottomNavigationView
app:labelVisibilityMode="labeled" />
टेक्स्ट एनीमेशन को डिसेबल करने के लिए और फॉन्ट साइज़ को कम करने के लिए इसे अपनी dimens.xml फ़ाइल में उपयोग करें:
<dimen name="design_bottom_navigation_text_size">10sp</dimen>
<dimen name="design_bottom_navigation_active_text_size">10sp</dimen>
Navigate
-> File...
> design_bottom_navigation_item.xml
है कि वहाँ कोई दूसरा रास्ता देखने के लिए।
अपडेट करें
एंड्रॉइड एसडीके संस्करण 28 और इसके बाद के संस्करण में वे बदल item.setShiftingMode(false)
गए हैंitem.setShifting(false)
साथ ही उन्होंने मैदान को हटा दिया mShiftingMode
तो उपयोग होगा
BottomNavigationHelper.removeShiftMode(bottomNav);
bottomNav.setLabelVisibilityMode(LabelVisibilityMode.LABEL_VISIBILITY_LABELED);
private static final class BottomNavigationHelper {
@SuppressLint("RestrictedApi")
static void removeShiftMode(BottomNavigationView view) {
BottomNavigationMenuView menuView = (BottomNavigationMenuView) view.getChildAt(0);
for (int i = 0; i < menuView.getChildCount(); i++) {
BottomNavigationItemView item = (BottomNavigationItemView) menuView.getChildAt(i);
//noinspection RestrictedApi
item.setShifting(false);
item.setLabelVisibilityMode(LabelVisibilityMode.LABEL_VISIBILITY_LABELED);
// set once again checked value, so view will be updated
//noinspection RestrictedApi
item.setChecked(item.getItemData().isChecked());
}
}
}
जैसा कि दूसरों ने बताया है, समर्थन पुस्तकालय 28.0.0-अल्फा 1 के बाद से यह संभव है:
<android.support.design.widget.BottomNavigationView
app:labelVisibilityMode="labeled" />
या आप इसे प्रोग्रामेटिक रूप से सेट कर सकते हैं ।
नोट: यदि आप समर्थन लाइब्रेरी के पुराने संस्करण से अपग्रेड कर रहे हैं, तो SDK संस्करण संकलित करना न भूलें। यहाँ समर्थन लाइब्रेर के संस्करणों की जाँच करें: समर्थन लाइब्रेरी संस्करण
हालाँकि, आपको अभी भी लेबल विचलन मिल सकता है, नहीं मिला जब संकलन ऐप आपके पुराने डिज़ाइन समर्थन लाइब्रेरी के पुराने संस्करणों पर निर्भर करता है, जब संदेश । यदि यह स्थिति है, तो दी गई निर्भरता के एक संस्करण में अपग्रेड करने का प्रयास करें, जो कम से कम 28.0.0-अल्फा -1 डिज़ाइन समर्थन लाइब्रेरी के संस्करण पर निर्भर करता है। यदि यह संभव नहीं है, तो निर्भरता को स्पष्ट रूप से परिभाषित करें।
यदि आप ग्रैडल का उपयोग करते हैं
स्पष्ट रूप से अपने build.gradle में डिज़ाइन समर्थन निर्भरता जोड़ने के लिए :
कार्यान्वयन 'com.android.support:design:28.0.0'
डिफ़ॉल्ट का उपयोग कर अद्यतन उत्तर के लिए। नवीनतम डिज़ाइन लाइब्रेरी में अपडेट करें
कार्यान्वयन "com.android.support:design:28.0.0"
और अपने bottomNavigationView xml विशेषताओं पर रखें
app:itemHorizontalTranslationEnabled="false"
आप इसे प्रोग्रामेटिक रूप से भी लगा सकते हैं
bottomNavigationView.setItemHorizontalTranslationEnabled(false);
आप यहां नीचे से स्रोत देख सकते हैं
आशा है कि यह आपकी मदद करता है।
app:labelVisibilityMode
?
अपने BottomNavigationView
जोड़ने के लिएapp:labelVisibilityMode="unlabeled"
<android.support.design.widget.BottomNavigationView
app:menu="@menu/bn_menu"
android:layout_height="56dp"
android:layout_width="match_parent"
app:labelVisibilityMode="unlabeled">
</android.support.design.widget.BottomNavigationView>
जिसके परिणामस्वरूप निम्नलिखित है
यह बहुत सरल है, बस बॉटमवैन्यूएशन व्यू में एक संपत्ति जोड़ें
app:labelVisibilityMode="unlabeled"
मेरा बॉटमवेशन व्यू के साथ कुछ अजीब व्यवहार था। जब मैं इसमें किसी भी आइटम / टुकड़े का चयन कर रहा था, तो टुकड़ा नीचे को नीचे की ओर धकेलता है, इसलिए नीचे का पाठ स्क्रीन के नीचे चला जाता है, इसलिए केवल चिह्न दिखाई देते थे और पाठ किसी भी वस्तु को क्लिक करने पर छिप जाता है।
यदि आप उस अजीब व्यवहार का सामना कर रहे हैं तो यहाँ समाधान है। जरा हटाओ
android:fitsSystemWindows="true"
टुकड़े के अपने मूल लेआउट में। जरा इसे हटाओ और उछालो! BottomNavigationView ठीक काम करेगा, अब इसे टेक्स्ट और आइकन के साथ दिखाया जा सकता है। मैं अपने मूल में यह था टुकड़े के CoordinatorLayout।
इसके अलावा जोड़ना मत भूलना
BottomNavigationViewHelper.disableShiftMode(bottomNavigationView);
अपनी गतिविधि में शिफ्टिंग मोड को निष्क्रिय करने के लिए। हालाँकि यह पूछे गए प्रश्न से संबंधित नहीं है, लेकिन फिर भी मुझे यह मददगार लगता है।
यह मैं का उपयोग एक तीसरी पार्टी पुस्तकालय है और यह बदलाव मोड को अक्षम, केवल माउस दिखा, माउस आकार सेट, आदि जैसे कई अनुकूलन विकल्प है BottomNavigationViewEx
यदि आप भी उस कष्टप्रद छोटे टॉप मार्जिन एनीमेशन से छुटकारा पाना चाहते हैं, तो आपको अधिक प्रतिबिंब कोड की आवश्यकता है। यहाँ पूरा समाधान है जो किसी भी एनीमेशन को हटाता है:
@SuppressLint("RestrictedApi")
private 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);
Field shiftAmount = item.getClass().getDeclaredField("mShiftAmount");
shiftAmount.setAccessible(true);
shiftAmount.setInt(item, 0);
shiftAmount.setAccessible(false);
item.setChecked(item.getItemData().isChecked());
}
} catch (NoSuchFieldException e) {
Timber.e(e, "Unable to get fields");
} catch (IllegalAccessException e) {
Timber.e(e, "Unable to change values");
}
}
और सुनिश्चित करें कि इसे अपने रक्षक फ़ाइल में जोड़ें:
-keepclassmembers class android.support.design.internal.BottomNavigationMenuView {
boolean mShiftingMode;
}
-keepclassmembers class android.support.design.internal.BottomNavigationItemView {
int mShiftAmount;
}
अपनी लाइब्रेरी को 28.0.0 पर अपडेट करें।
bottomNav.setLabelVisibilityMode(LabelVisibilityMode.LABEL_VISIBILITY_LABELED);
बस इस विधि से ऊपर जोड़ना चाहते हैं अक्षम करेंशिफ्टकोड कोड के नीचे भी जोड़ें। @SuppressLint ( "RestrictedApi")
https://android.jlelse.eu/disable-shift-label-animation-from-bottom-navigation-android-b42a25dcbffc
1
<com.google.android.material.bottomnavigation.BottomNavigationView
...
app:itemHorizontalTranslationEnabled="false"/>
2
<com.google.android.material.bottomnavigation.BottomNavigationView
...
app:labelVisibilityMode="labeled"/>
3
<resources xmlns:tools="http://schemas.android.com/tools">
<dimen name="design_bottom_navigation_active_text_size"
tools:override="true">12sp</dimen>
आप इसका उपयोग टेक्स्ट और आइकन्स दोनों के लिए बॉटम नेशनव्यू व्यू पर 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>
मुझे इन लिंक और लिंक से मदद मिली। आप इन लिंक का अध्ययन करके भी सहायता प्राप्त कर सकते हैं। यह मुझे बहुत मदद करता है। यह आपकी मदद भी करता है। धन्यवाद....