2010-11-16 20 views
41

मेरे पास Activity पर MenuItem "स्टार्ट" के साथ एक विकल्प मेनू है। जब यह MenuItem चुना गया है, तो मैं मेनू को बदलना चाहता हूं, इसलिए इसमें MenuItem "रोकें" शामिल है। और आखिरकार जब "स्टॉप" चुना जाता है, तो मैं वापस "स्टार्ट" में बदलना चाहता हूं।एंड्रॉइड पर विकल्प मेनू पर मेनू मेनू कैसे बदल सकता हूं?

यहां मेरे कोड के कुछ भाग हैं जो काम नहीं कर रहे हैं। मैं दोनों "प्रारंभ" और "बंद" mymenu.xml में सूचीबद्ध मैं चाहिए शायद हटाने "रोक" जब मेनू बनाई गई है है:

public class MyActivity extends Activity { 
    private boolean isStarted = false; 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     MenuInflater inflater = getMenuInflater(); 
     menu.removeItem(R.id.stop); 
     inflater.inflate(R.menu.mymenu, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
     case R.id.start: 
      isStarted = true; 
      return true; 
     case R.id.stop: 
      isStarted = false; 
      return true; 
     default: 
      return super.onOptionsItemSelected(item); 
     } 
    } 

    @Override 
    public boolean onPrepareOptionsMenu(Menu menu) { 
     if(isStarted) { 
      menu.removeItem(R.id.start); 
      menu.add(R.id.stop); 
     } else { 
      menu.removeItem(R.id.stop); 
      menu.add(R.id.start); 
     } 
     return true; 
    } 
} 
+1

क्या आपने मेन्यू बनने पर रोक को हटाने की कोशिश की है? कोड अच्छा लग रहा है। मैं कुछ भी नहीं खोज सकता जो इसके अलावा अन्य मुद्दों का कारण बनता है। –

+0

@ ऑक्टोवियन: मैंने 'menu.removeItem (R.id.stop) के साथ प्रयास किया; 'getMenuInflater() के बाद' 'लेकिन यह काम नहीं किया। मुझे या तो दो मेनू आइटम मिलते हैं, एक "प्रारंभ" और एक "झूठा" ("रोकना चाहिए"), या जब मुझे दिखाया जाना चाहिए तो मेनू क्रैश हो जाता है। – Jonas

+1

आप 'removeItem()' कहां कॉल करने का प्रयास कर रहे हैं? 'OnPrepareOptionsMenu() 'में? –

उत्तर

94

आपरेशन के इस प्रकार मैं आमतौर पर मेनू आइटम को बदलने के लिए नहीं चुनते हैं, लेकिन अभी लोगों को छिपाने आप की जरूरत नहीं है के लिए:

@Override 
public boolean onPrepareOptionsMenu(Menu menu) { 
    super.onPrepareOptionsMenu(menu); 
    menu.findItem(R.id.start).setVisible(!isStarted); 
    menu.findItem(R.id.stop).setVisible(isStarted); 
    return true; 
} 
+0

बस देखा कि मैं पहले सुझाए गए सुपरक्लास को कॉल करना भूल गया था और [डॉक्स] में निर्दिष्ट (http: // डेवलपर।android.com/reference/android/app/Activity.html#onPrepareOptionsMenu%28android.view.Menu%29) और [स्रोत] (http://www.google.com/codesearch/p?hl=hi#uX1GffpyOZk/ कोर/जावा/एंड्रॉइड/एप/गतिविधि.जावा और डी = 3 और एल = 2272) – Flygenring

+0

और बस अपडेट करने के लिए, स्रोत http://grepcode.com/file/repository.grepcode.com/java/ext/com पर पाया जा सकता है। google.android/android/2.3_r1/android/app/Activity.java?av=f#2272 – Flygenring

6

आप शायद super.onPrepareOptionsMenu कॉल करने के लिए के बाद आप अपने बदलाव करना समाप्त कर की जरूरत है। docs से:

पाने कक्षाओं हमेशा आधार वर्ग कार्यान्वयन के लिए के माध्यम से फोन करना चाहिए।

+0

+1। –

3

मुझे समाधान मिला। removeItem() पर कॉल करते समय आप संदर्भ को हटाकर MenuItem हटा रहे हैं। इस कोड का उपयोग काम करता है।

private boolean isStarted = false; 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
    case 1: 
     isStarted = true; 
     return true; 
    case 0: 
     isStarted = false; 
     return true; 
    default: 
     return super.onOptionsItemSelected(item); 
    } 
} 

@Override 
public boolean onPrepareOptionsMenu(Menu menu) { 

    if(isStarted) { 
     menu.removeItem(1); 
     menu.add(0, 0, 0, "Stop"); 
    } else { 
     menu.removeItem(0); 
     menu.add(0, 1, 0, "Start"); 
    } 

    return super.onPrepareOptionsMenu(menu); 
} 

आपको फिर से MenuItem बनाना होगा। false लेबल का भी कारण है। असल में आपको MenuInflater की आवश्यकता नहीं है क्योंकि आप कोड के माध्यम से Menu बनाते हैं ताकि किसी भी मेनू XML फ़ाइल की आवश्यकता न हो।

20

Flygenring जवाब सही है, लेकिन menu.findItem () लगी है और इसे पर कॉल कर रहा है ऑनपेरऑप्शनमेनू (मेनू मेनू) खराब उपयोगकर्ता अनुभव उत्पन्न करता है। यह मेनू बनाने के दौरान वस्तु एक बार MenuItem प्राप्त करने के लिए बेहतर है, और फिर बस setVisible हर बार मेनू स्क्रीन पर occures फोन: इस पोस्ट में जानकारी के रूप में यह में झूठी लेबल की मेरी समस्या हल के लिए

MenuItem mDynamicMenuItem; 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     // Get dynamic menu item 
     mDynamicMenuItem = menu.findItem(R.id.menu_item); 
     return true; 
    } 

    // Prepare the Screen's standard options menu to be displayed. This is called right 
    // before the menu is shown, every time it is shown. You can use this method to 
    // efficiently enable/disable items or otherwise dynamically modify the contents. 
    @Override 
    public boolean onPrepareOptionsMenu(Menu menu) { 
     super.onPrepareOptionsMenu(menu); 
     // Here is just a good place to update item 
     mDynamicMenuItem.setVisible(isVisible); 
     return true; 
    } 
1

धन्यवाद मेरे मेन्यू। मुझे इसे थोड़ा संशोधित करना पड़ा और अंतिम कोड जो अच्छी तरह से काम करता है, उम्मीद है कि यह किसी और को कुछ समय और निराशा बचाता है। यह थोड़ा अलग समाधान है लेकिन मैंने जो मुख्य परिवर्तन किया है वह सही या गलत है। इसके अलावा i.shadrins समाधान मेरी आवश्यकताओं के लिए सबसे अच्छा फिट था।

@Override 
public boolean onPrepareOptionsMenu(Menu menu) { 
    super.onPrepareOptionsMenu(menu); 

    if(loggedIn) 
    { 
     logIn.setVisible(false); 
     logOut.setVisible(true); 
    } 
    else 
    { 
     logIn.setVisible(true); 
     logOut.setVisible(false); 
    } 
    return true; 
} 


@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    super.onCreateOptionsMenu(menu); 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    logIn = menu.findItem(R.id.loggedOut); 
    logOut = menu.findItem(R.id.loggedIn); 
    return true; 
} 
+0

किस फ़ाइल में इसे रखा जाना चाहिए? –