2012-06-13 6 views
49

मैं एक Activity जो एक ActionBar है है, लेकिन मैं गतिशील ActionBar पर माउस को बदलने की जरूरत है, मैं एक ठहराव और एक खेलने बटन है और मैं खेलने बटन को बदलने के लिए की जरूरत है बटन के साथ उपयोगकर्ता उस पर क्लिक करें। मैं खोज की है और मुझे मिल गया:प्रतीक बदलें गतिशील

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    if(DEBUG) Log.i("onCreateOptionsMenu()", "onCreateOptionsMenu() -> LogicAnalizerView"); 
    //menu.add("").setIcon(R.drawable.pause).setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.actionbarlogic, menu); 
    menu.removeItem(R.id.pauseLogic); 

    return true; 
} 

तो इस तरह से मैं रोकें बटन को हटा दें और मैं यह भी जोड़ सकते हैं, लेकिन यह तभी हो जब मैं Activity शुरू करने और ActionBar ली गई है। मैं ActionBar को फिर से निकालने के लिए कैसे मजबूर कर सकता हूं? इसके अलावा, इस तरह से पूरे ActionBar को फिर से खींचा गया है। क्या वह सही है? क्या मुझे केवल बटन/आइकन को फिर से निकालने का कोई तरीका है?

धन्यवाद :)

+7

http://developer.android.com/guide/topics/ui/menus.html - इस लिंक में वास्तव में "रनटाइम पर मेनू बदलना मेनू" अनुभाग है! – trumpetlicks

+1

धन्यवाद, यह पूरी तरह से काम करता है और ऐसा करने का सही तरीका लगता है :) – Andres

उत्तर

44

आप मुद्रास्फीति करने के बाद MenuItem के लिए एक संदर्भ बंद को बचाने के लिए होगा। तो निम्न की तरह कुछ:

public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.actionbarlogic, menu); 
    playMenu = menu.findItem(R.id.playMenu); 
    updatePlayStatus(); 
    return menu; 
} 

public void updatePlayStatus() { 
    if(playService.isConnected()) { 
     playService.isPlaying() ? playMenu.setIcon(R.drawable.pause) : playMenu.setIcon(R.drawable.play); 
    } 
} 

फिर आप playMenu को किसी भी समय संदर्भित कर सकते हैं। तो आप आइटम को संशोधित कर सकते हैं जैसे कि आपका खिलाड़ी खेलना समाप्त कर देता है और उसे प्ले आइकन पर वापस जाना चाहिए।

+1

धन्यवाद, लेकिन मैं इसे एंड्रॉइड डेवलपर्स के लिंक को सफ़ेद कर रहा हूं :) – Andres

+0

playService क्या है? –

+0

@NeonWarge यह उसका अपना कोड है। बस इसे नजरअंदाज करें। आपको केवल 'playMenu' पर ध्यान देना होगा। – chjarder

9
private Menu mMenu; 

@Override 
public boolean onCreateOptionsMenu(Menu menu) 
{ 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.menu_main_activity, menu); 

    // Save the menu reference 
    mMenu = menu; 
    return super.onCreateOptionsMenu(menu); 
} 

// For example - Call when you need to change icon 
private void setActionIcon(boolean showWithBadge) 
{ 
    MenuItem item = mMenu.findItem(R.id.ITEM_ID); 

    if(mMenu != null) 
    { 
     if(showWithBadge) 
     { 
      item.setIcon(R.drawable.IC_WITH_BADGE);   
     } 
     else 
     { 
      item.setIcon(R.drawable.IC_WITHOUT_BADGE); 
     } 
    } 
} 
2

अपनी गतिविधि कक्षा में onPrepareOptionsMenu ओवरराइड और फिर आप जोड़ सकते हैं/हटाने या दिखाई/अदृश्य मेनू आइटम।

15

उन्हें हटाने के बजाय, आप केवल उस बटन को छुपा सकते हैं जिसे आप प्रदर्शित नहीं करना चाहते हैं।

उदाहरण के लिए:

private boolean isPlaying; 
MenuItem mPlayMenuItem; 
MenuItem mPauseMenuItem; 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu items for use in the action bar 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.actionbarlogic, menu); 

    mPlayMenuItem = menu.findItem(R.id.action_play); 
    mPauseMenuItem = menu.findItem(R.id.action_pause); 

    return super.onCreateOptionsMenu(menu); 

} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 

    switch (item.getItemId()) { 
     case R.id.action_play: 
      isPlaying = true; 
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
       this.invalidateOptionsMenu(); 
      } 
      return true; 
     case R.id.action_pause: 
      isPlaying = false; 
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
       this.invalidateOptionsMenu(); 
      } 
      return true; 
     default: 
      return super.onOptionsItemSelected(item); 
    } 
} 


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

    if (isPlaying) { 
     mPlayMenuItem.setVisible(false); // hide play button 
     mPauseMenuItem.setVisible(true); // show the pause button 
    } else if (!isPlaying) { 
     mPlayMenuItem.setVisible(true); // show play button 
     mPauseMenuItem.setVisible(false); // hide the pause button 
    } 

    return true; 
} 

बस एक ध्यान दें, यह:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
    this.invalidateOptionsMenu(); 
} 

कार्रवाई बार अद्यतन करने के लिए आवश्यक है। 3.0 डिवाइस के बाद, एक्शन बार स्वचालित रूप से अपडेट नहीं होता है। इसलिए, आपको इसे "OnPrepareOptionsMenu (मेनू)" पर कॉल करने के लिए मैन्युअल रूप से बताना होगा ताकि यह "Activity.invalidateOptionsMenu()" को कॉल करके आइटम रीफ्रेश कर देगा।

आशा है कि इससे मदद मिलती है!

संदर्भ: http://developer.android.com/reference/android/app/Activity.html#onPrepareOptionsMenu(android.view.Menu)

http://developer.android.com/reference/android/support/v4/app/ActivityCompat.html#invalidateOptionsMenu(android.app.Activity)

2

आप अपने मेनू से पहले आइटम प्राप्त करना चाहते हैं, **

use menu.getItem(0);

इस संहिता पूरी तरह से woks:

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 

    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.my_menu, menu); 
     MenuItem m = menu.getItem(0); 
     m.setIcon(R.drawable.your_icon_here); 
    } 


    return true; 
} 
संबंधित मुद्दे