जैसे ही हम आइटम स्विच करते हैं, मैं नीचे नेविगेशन दृश्य के आइकन में बदलना चाहता हूं।

enter image description here

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

enter image description here

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

नीचे_नव_मेनू

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

    <item
        android:id="@+id/navigation_home"
        android:icon="@drawable/home_icon_selector"
        android:title="@string/title_home" />

    <item
        android:id="@+id/navigation_scheduler"
        android:icon="@drawable/schelduler_icon_selector"
        android:title="@string/title_scheduler" />

    <item
        android:id="@+id/navigation_favourites"
        android:icon="@drawable/favourites_icon_selector"
        android:title="@string/title_favourites" />


    <item
        android:id="@+id/navigation_settings"
        android:icon="@drawable/settings_icon_selector"
        android:title="@string/title_settings" />
</menu>

घर

    <com.google.android.material.bottomnavigation.BottomNavigationView
    android:id="@+id/nav_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginStart="@dimen/margin_20"
    android:layout_marginLeft="@dimen/margin_20"
    android:layout_marginRight="@dimen/margin_20"
    android:layout_marginEnd="@dimen/margin_20"
    android:layout_marginBottom="@dimen/margin_8"
    android:background="@drawable/bottom_navigation_background"
    android:elevation="8dp"
    app:itemIconTint="@drawable/bottom_navigation_color_selector"
    app:labelVisibilityMode="unlabeled"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:menu="@menu/bottom_nav_menu" />

और चयनकर्ता

अनुसूचक चयनकर्ता

    <?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/qa_scheduler_inactive" android:state_checked="false"/>
    <item android:drawable="@drawable/ic_scheduler_blue" android:state_checked="true"/>
</selector>

सेटिंग्स चयनकर्ता

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/qa_settings_inactive" android:state_checked="false"/>
    <item android:drawable="@drawable/ic_settings_blue" android:state_checked="true"/>
</selector>

पसंदीदा चयनकर्ता

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/qa_favorites_inactive" android:state_checked="false"/>
    <item android:drawable="@drawable/ic_favourites_blue" android:state_checked="true"/>
</selector>

होम चयनकर्ता

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/qa_home_inactive" android:state_checked="false"/>
    <item android:drawable="@drawable/ic_home" android:state_checked="true"/>
</selector>

गतिविधि कोड

    val navView: BottomNavigationView = findViewById(R.id.nav_view)
    val navController = findNavController(R.id.nav_host_fragment)
    // Passing each menu ID as a set of Ids because each
    // menu should be considered as top level destinations.
    val appBarConfiguration = AppBarConfiguration(setOf(
            R.id.navigation_home, R.id.navigation_scheduler, R.id.navigation_favourites, R.id.navigation_settings))
    //  setupActionBarWithNavController(navController, appBarConfiguration)
    navView.setupWithNavController(navController)

मुझसे यहां क्या गलत हो रहा है? कृपया सहायता कीजिए...

संपादित करें: मैं निम्नलिखित ड्रॉबल्स का उपयोग कर रहा हूं:

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

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

2
Sid 18 अगस्त 2021, 13:14

3 जवाब

सबसे बढ़िया उत्तर

इस समस्या का कारण यह है कि हमेशा app:itemIconTint के लिए एक मान होता है, भले ही इसका उपयोग न किया गया हो, यह प्राथमिक/उच्चारण रंगों के डिफ़ॉल्ट मान लेता है।

तो अपनी समस्या को हल करने के लिए आपको इसे स्पष्ट रूप से अक्षम करने की आवश्यकता है:

val btmNav = findViewById<BottomNavigationView>(R.id.nav_view)
navView.itemIconTintList = null

हालांकि मैं एक और चीज की सिफारिश करता हूं:

चेक किए गए/अनचेक किए गए राज्यों में आइकन पहले से ही समान आइकन हैं, लेकिन विभिन्न टिंट रंगों के साथ। यदि ये आइकन वेक्टर हैं, तो आप app:itemIconTint में एक चयनकर्ता का उपयोग करके केवल रंगों को रंग सकते हैं, और संसाधनों को डुप्लिकेट करने की आवश्यकता के बिना आइकन के एकल संस्करण का उपयोग कर सकते हैं:

Icon_color_selector.xml:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="#2596CD" android:state_checked="true" />
    <item android:color="#84D0F4" android:state_checked="false" />
</selector>

और इसे लागू करें:

<com.google.android.material.bottomnavigation.BottomNavigationView
    ...
    app:itemIconTint="@drawable/icon_color_selector"

और मेनू आइटम को केवल आइकन के साथ रखें, चयनकर्ता नहीं, उदाहरण के लिए:

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

    <item
        android:id="@+id/navigation_home"
        android:icon="@drawable/home_icon"  //<<<<< icon not selector
        android:title="@string/title_home" />

    ....

</menu>

अद्यतन करें:

जैसा कि आप नेविगेशन आर्किटेक्चर घटकों का उपयोग कर रहे हैं, सुनिश्चित करें कि bottomNavView मेनू में वही आईडी हैं जो bottomNavView फ़्रैगमेंट के navGraph में संबंधित आईडी से मेल खाती हैं।

यदि आप bottomNavView अंशों के लिए navGraph का उपयोग नहीं करते हैं, तो आप navView.setupWithNavController(navController) का उपयोग नहीं कर सकते

यहाँ आपके ड्रा करने योग्य आइकन के साथ है

0
Zain 31 अगस्त 2021, 03:18

यह सिर्फ एक जंगली अनुमान है, लेकिन शायद यह पंक्ति यहाँ है:

app:itemIconTint="@drawable/bottom_navigation_color_selector"

आपके चित्र के रंगों में हस्तक्षेप कर रहा है? यदि आपके ड्रॉबल्स में सही रंग (हल्का नीला/गहरा नीला) है, तो उन्हें आपके वर्तमान चयनकर्ताओं के साथ काम करना चाहिए।

वैकल्पिक रूप से, जांचें कि आपने नीचे-एनएवी के लिए app:itemIconTint को किसी अन्य तरीके से सेट नहीं किया है, उदाहरण के लिए थीम या प्रोग्रामेटिक रूप से!

0
Christos Christidis 23 अगस्त 2021, 23:49

आप चयनकर्ता का उपयोग करके इसे प्राप्त कर सकते हैं जैसे @Chris ने कहा या आप इसे setOnNavigationItemSelectedListener{} का उपयोग करके गतिशील रूप से कर सकते हैं

अपडेट - आइकन बदलने के लिए, आप वर्तमान item.icon को भरे हुए और अन्य को खाली किए गए आइकन में बदलकर बस बलपूर्वक बल कर सकते हैं, देखें यहां इसका सार जानने के लिए (टैबलेआउट के लिए इसकी कॉपी न करें) )

navView.setOnNavigationItemSelectedListener { item -> 
            // change  the icon to filled icon
            true
        }

ऐसा लगता है कि लिस्टर का मूल्यह्रास हो गया है इसलिए यह देखें।

0
Anshul 24 अगस्त 2021, 10:22