2011-08-20 92 views
71

是否可以通過編程方式更改選項菜單項?任何人都可以提供給我一個例子嗎?另外,我想禁用某些項目,以便他們不聽點擊,這是可能的嗎?android:以編程方式更改選項菜單項

謝謝。

+1

你想要什麼樣的變化? –

回答

25

menu.xml文件

<item 
    android:id="@+id/item1" 
    android:title="your Item"> 
    </item> 

把你的java文件

public void onPrepareOptionsMenu(Menu menu) { 

    menu.removeItem(R.id.item1); 
} 
+2

禁用不會刪除 – zizoujab

+0

它爲我工作。謝謝。 –

+0

這是我正在尋找的人,因爲我想在運行時做出一次決定,但不需要在之後更改選項。我使用: @Override public boolean onPrepareOptionsMenu(Menu menu){ if(!showItemName){ menu.removeItem(R.id.itemname); } return true; } – notmystyle

7

如果我有onMenuOpened期間更改我的選項菜單的我執行它的內容()。這允許我在用戶訪問菜單的那一刻檢查運行狀態。

public boolean onMenuOpened(int featureid, Menu menu) 
    { 
     menu.clear(); 
     if (!editable) 
     { 
      MenuItem itemAdd = menu.add(0, REASSIGN, Menu.NONE, context.getString(R.string.reassign)); 
      MenuItem itemMod = menu.add(1, EDIT, Menu.NONE, context.getString(R.string.modify)); 
      MenuItem itemDel = menu.add(2, DELETE, Menu.NONE, context.getString(R.string.delete)); 
      itemAdd.setShortcut('0', 'a'); 
      itemMod.setShortcut('1', 'm'); 
      itemDel.setShortcut('2', 'd'); 
     } 
     else 
     { 
      MenuItem itemSave = menu.add(3, SAVE, Menu.NONE, context.getString(R.string.savechanges)); 
      itemSave.setShortcut('0', 'S'); 
     } 


     return true; 
    } 
182

對於任何需要改變的動態菜單的選項:

private Menu menu; 

// ... 

@Override 
public boolean onCreateOptionsMenu(Menu menu) 
{ 
    this.menu = menu; 
    getMenuInflater().inflate(R.menu.options, menu); 
    return true; 
} 

// ... 

private void hideOption(int id) 
{ 
    MenuItem item = menu.findItem(id); 
    item.setVisible(false); 
} 

private void showOption(int id) 
{ 
    MenuItem item = menu.findItem(id); 
    item.setVisible(true); 
} 

private void setOptionTitle(int id, String title) 
{ 
    MenuItem item = menu.findItem(id); 
    item.setTitle(title); 
} 

private void setOptionIcon(int id, int iconRes) 
{ 
    MenuItem item = menu.findItem(id); 
    item.setIcon(iconRes); 
} 
+0

我試過這個,但是沒有幫助,你能幫我理由嗎? – Prateek

+7

有一點需要注意的是,在嘗試從其中獲取'MenuItem'之前,您必須確保已設置'menu'。例如,如果你有'actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS)'這樣的東西,這些標籤會在菜單前加載,所以在'onTabSelected'中調用'hideOption' /'showOption'會導致一個空指針異常。 – SaltyNuts

+3

爲什麼這不被標記爲正確的解決方案?它比「正確」的答案更好地解釋瞭解決方案。 – GiaNU

5

更詳細的descriped禁用某些項目:

MenuItem item = menu.findItem(R.id.ID_ASSING_TO_THE_ITEM_IN_MENU_XML); 
item.setEnabled(false); 
2

你可以像我一樣做簡單的事情。只需將文本更改爲觸摸菜單項時所需的內容即可。我需要關閉和打開聲音,以及通過觸摸來執行操作的功能。這是我的代碼:

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 

    switch (item.getItemId()) { 
    case R.id.audioOn: 
     audioOn = !audioOn; 
     if (audioOn) 
      item.setTitle("Audio Off"); 
     else 
      item.setTitle("Audio On"); 
     return true; 

    case R.id.touchOn: 
     touchOn = !touchOn; 
     if (touchOn) 
      item.setTitle("Touch Off"); 
     else 
      item.setTitle("Touch On"); 
     return true; 
    default: 
     return super.onOptionsItemSelected(item); 
    } 
} 

audioOn和touchOn是在代碼的其他部分檢查的布爾值。希望這可以幫助。

+0

我該如何動態地做到這一點。我的意思是...在選擇一個選項後調用web服務,然後調用它的成功響應...重新調用onCreateOptionsMenu。如何做? – NarendraJi

3

試試這個代碼:

@Override 
public boolean onPrepareOptionsMenu(Menu menu) { 
    this.menu=menu; 
    updateMenuItems(menu); 
    return super.onPrepareOptionsMenu(menu); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.document_list_activity_actions, menu); 
    return super.onCreateOptionsMenu(menu); 
} 


@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle presses on the action bar items 
    if (item.getItemId() == android.R.id.home) { 
     onHomeButtonPresssed(); 
    }else if (item.getItemId() == R.id.action_delete) { 
     useCheckBoxAdapter=false; 
     deleteDocuments(); 
    } else if (item.getItemId() == R.id.share) { 
     useCheckBoxAdapter=false; 
     shareDocuments(); 
    } else if (item.getItemId() == R.id.action_tick) { 
     useCheckBoxAdapter=true; 
     onShowCheckboxes(); 
    } 
    updateMenuItems(menu); 
    return true; 
} 

private void updateMenuItems(Menu menu){ 
    if (useCheckBoxAdapter && menu != null) { 
     menu.findItem(R.id.action_delete).setVisible(true); 
     menu.findItem(R.id.share).setVisible(true); 
     menu.findItem(R.id.action_tick).setVisible(false); 
    } else { 
     menu.findItem(R.id.action_delete).setVisible(false); 
     menu.findItem(R.id.share).setVisible(false); 
     menu.findItem(R.id.action_tick).setVisible(true); 
    } 
    invalidateOptionsMenu(); 
} 
0

您可以通過實現如下簡單地完成你的任務:使用以下行我已經做了在菜單中添加值

private Menu menu; 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.drive_menu, menu); 
    return true; 
} 

@Override 
public boolean onPrepareOptionsMenu(Menu menu) { 
    this.menu = menu; 
    return super.onPrepareOptionsMenu(menu); 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    int id = item.getItemId(); 

    if (id == R.id.action_toggle_grid) { 
     handleMenuOption(id); 
     return true; 

    } else if(id == R.id.action_toggle_list){ 
     handleMenuOption(id); 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 

private void handleMenuOption(int id) { 
    MenuItem item = menu.findItem(id); 
    if (id == R.id.action_toggle_grid){ 
     item.setVisible(false); 
     menu.findItem(R.id.action_toggle_list).setVisible(true); 
    }else if (id == R.id.action_toggle_list){ 
     item.setVisible(false); 
     menu.findItem(R.id.action_toggle_grid).setVisible(true); 
    } 
} 
4

getActivity().invalidateOptionsMenu(); 

嘗試這項工作就像一個魅力給我。

1

如果你有一個BottomBar:

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 

    if (mBottomBar.getCurrentTabId() == R.id.tab_more) { 
     getMenuInflater().inflate(R.menu.more_menu, menu); 
    } 

    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case R.id.preferences: 
      startActivity(new Intent(this, PreferenceActivity.class)); 
      break; 
    } 

    return super.onOptionsItemSelected(item); 
} 

然後你只需要調用:

@Override 
public void onBottomBarClick(int tabId) { 
    supportInvalidateOptionsMenu(); 
} 
相關問題