मैं MainActivity में एक मेनू टूलबार बना रहा हूं, जिसमें शरीर का टुकड़ा है (एकमात्र टूलबार गतिविधि में सेट है टुकड़ों के भीतर नहीं)

जब डिफ़ॉल्ट टुकड़ा (होमफ्रैगमेंट) सेट किया जाता है, तो मैं टूलबार मेनू से search और sort आइकन छिपाना चाहता हूं, अन्यथा उन्हें अन्य ContentFragment में दिखाने के लिए

ContentFragment अलग-अलग टूलबार नाम ले सकते हैं verbs, nouns, pronouns.. और HomeFragment केवल Home

यही कारण है कि मैं if(supportActionBar!!.title== "Home") { का उपयोग कर रहा हूं

MainActivity.kt

  class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
   transaction(HomeFragment)...commit()
    .....
  }

 //below bundle ends
  override fun onPrepareOptionsMenu(menu: Menu?): Boolean {
    if(supportActionBar!!.title== "Home") {
        menu?.findItem(R.id.db_menu_search)?.isVisible  = false
        menu?.findItem(R.id.db_menu_sort)?.isVisible   = false
    }else{
        menu?.findItem(R.id.db_menu_search)?.isVisible  = true
        menu?.findItem(R.id.db_menu_sort)?.isVisible   = true
    }

    return super.onPrepareOptionsMenu(menu)
}


    override fun onCreateOptionsMenu(menu: Menu?): Boolean {
            menuInflater.inflate(R.menu.header_menu, menu)
        return true
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean {

        when (item.itemId) {
            R.id.db_menu_search -> {

                Toast.makeText(applicationContext, "Search Clicked", Toast.LENGTH_SHORT)
                    .show()
            }
            R.id.db_menu_sort -> {
                sortDialog()
            }

            R.id.header_menu_verbs -> {
                getToFragmentB("Verbs",1)
            }
          
        }
        return false
    }

हेडर_मेनू.एक्सएमएल

 //just informative

 <item id=db_menu_search icon=ic_search />
 <item id=db_menu_sort icon=ic_sort />
 <item id=db_menu_verbs />
   <item id=db_menu_nouns /> ....

मैंने onPrepareOptionsMenu इसे काम करने की उम्मीद में जोड़ा ... यह ठीक से काम नहीं करता है

क्या गलत कर रहा हूं?

गतिविधि में HomeFragment सेट होने पर मैं टूलबार से उन दो आइकन को कैसे छिपा सकता हूं और दूसरा टुकड़ा प्रदर्शित होने के बाद उन्हें दिखा सकता हूं?

0
morty 5 फरवरी 2021, 04:53
मुझे लगता है कि समस्या यह है कि आप शीर्षक से वर्तमान खंड का पता लगा रहे हैं। मैं नहीं जानता कि आप प्रत्येक खंड के लिए शीर्षक कैसे निर्धारित करते हैं, इसलिए यह गलत शीर्षक हो सकता है, जब onPrepareOptionsMenu को कॉल किया जाता है। वर्तमान खंड का पता लगाने के लिए आपको खंड प्रबंधक का उपयोग करना चाहिए: supportFragmentManager.findFragmentById (R.id.fragment_id) फिर आप इसे onPrepareOptionsMenu खंड में उपयोग कर सकते हैं! = शून्य && खंड। दृश्यमान { खंड के आधार पर आइकन दिखाएं / छुपाएं}। यहां खंड कैसे खोजें stackoverflow.com/questions/9294603/…
 – 
Artem Chernousov
5 फरवरी 2021, 07:54
शुक्रिया। लेकिन मैं वास्तव में आपकी बात नहीं समझता। तो आप मुझे यह जांचने के लिए कहें कि उस विशिष्ट क्षण में किस टुकड़े का उपयोग किया जा रहा है, और onPrepare... खंड कोड को सफेद करें? या मुख्य गतिविधि वर्ग के भीतर। मुझे इसे काम करने के लिए कोड का उपयोग करने के लिए कहां माना जाना चाहिए?
 – 
morty
5 फरवरी 2021, 17:35
मैंने लिखा, कि मैं सोच रहा हूं, कि कॉल के क्षण में PrepareOptionsMenu आपके पास टूलबार में गलत शीर्षक है, और परिणाम के रूप में गलत काम करने वाले आइकन को टॉगल करें। आप चाहें तो मैं बाद में आपके लिए वर्किंग सॉल्यूशन लिख सकता हूं।
 – 
Artem Chernousov
5 फरवरी 2021, 17:43

1 उत्तर

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

मैं यहां मुख्य चरणों का वर्णन करता हूं, अंत में कार्य समाधान के लिए लिंक

  1. मेन्यू.एक्सएमएल के सभी आइटम्स का पैरामीटर android:visible="false" है

  2. setHasOptionsMenu(true) प्रत्येक खंड के onCreate() में होना चाहिए, जहां टूलबार में आइकन प्रस्तुत करना आवश्यक है। इसके बिना गतिविधि कार्य करती है

    onCreateOptionsMenu / onPrepareOptionsMenu को कभी भी फ्रैगमेंट बदलने पर कॉल नहीं किया जाएगा।

     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
    
         setHasOptionsMenu(true)
     }
    
  3. supportFragmentManager के माध्यम से onPrepareOptionsMenu में आइकन दिखाना/छिपाना संभालना। यह पता लगाने का एकमात्र तरीका है कि वर्तमान में कौन सा टुकड़ा प्रदर्शित हो रहा है।

       override fun onPrepareOptionsMenu(menu: Menu?): Boolean {
     supportFragmentManager.fragments.forEach {
       when {
         it.tag == FragmentTag.Fragment1.tag && it.isVisible -> {
           menu?.findItem(R.id.action_fragment1)?.isVisible = true
           menu?.findItem(R.id.action_fragment2)?.isVisible = true
         }
         it.tag == FragmentTag.Fragment2.tag && it.isVisible -> menu?.findItem(R.id.action_fragment2)?.isVisible = true
         it.tag == FragmentTag.Fragment3.tag && it.isVisible -> menu?.findItem(R.id.action_fragment3)?.isVisible = true
       }
     }
    
     return super.onPrepareOptionsMenu(menu)
    

    }

कोड टू वर्किंग सॉल्यूशन: https://github.com/ Yellow-cap/android -हैंडल-टूलबार-आइकन

1
Artem Chernousov 6 फरवरी 2021, 10:58
मेरे दोस्त, मैंने इसका परीक्षण किया और एक आकर्षण की तरह काम करता है, न केवल इस मुद्दे को हल किया, मैंने कुछ नया भी सीखा !! +1
 – 
morty
6 फरवरी 2021, 18:24
मेरे पास यह दूसरा सवाल है..क्या आप जानते हैं कि इसे कैसे हल किया जाए? धन्यवाद stackoverflow.com/q/66122287/13741397
 – 
morty
9 फरवरी 2021, 23:30