android 动态修改菜单,如何在Android的“选项”菜单上更改MenuItem?
如何在Android的“選項”菜單上更改MenuItem?
我的Activity上有一個選項菜單,帶有mymenu.xml“開始”。 選擇此3000128611611048489985后,我想更改菜單,使其包含MenuItem“停止”。 最后,當(dāng)選擇“停止”時,我想改回“開始”。
這是我的部分代碼無法正常工作。 我在mymenu.xml中同時列出了“開始”和“停止”,創(chuàng)建菜單時可能應(yīng)該刪除“停止”:
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;
}
}
6個解決方案
96 votes
對于這種類型的操作,我通常選擇不更改菜單項,而只隱藏不需要的菜單項:
@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;
}
Flygenring answered 2020-08-07T00:15:15Z
20 votes
Flygenring的答案是正確的,但是menu.findItem()太慢了,在onPrepareOptionsMenu(Menu menu)中調(diào)用它會產(chǎn)生不良的用戶體驗。 最好在創(chuàng)建菜單時獲取一次MenuItem對象,然后每次在屏幕上出現(xiàn)菜單時都調(diào)用setVisible:
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;
}
i.shadrin answered 2020-08-07T00:15:35Z
6 votes
完成更改后,可能需要調(diào)用super.onPrepareOptionsMenu。 從文檔:
派生類應(yīng)始終調(diào)用 直到基層 實施。
Cheryl Simon answered 2020-08-07T00:16:00Z
3 votes
我找到了解決方案。 調(diào)用false時,基本上就是刪除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);
}
您必須再次創(chuàng)建MenuItem。 那也是false標(biāo)簽的原因。 實際上,當(dāng)您通過代碼創(chuàng)建Menu時,您不需要MenuInflater,因此也不需要任何菜單XML文件。
Octavian Damiean answered 2020-08-07T00:16:24Z
1 votes
感謝您提供這篇文章中的信息,因為它解決了我菜單中錯誤標(biāo)簽的問題。 我確實需要對其進行一些修改,并使其最終代碼可以正常工作,如下所示,希望它可以節(jié)省其他人的時間和挫敗感。 它的解決方案稍有不同,但我所做的主要更改是將.setVisible更改為True或False,除了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;
}
timv answered 2020-08-07T00:16:45Z
0 votes
在Android 3.0及更高版本上,您應(yīng)該調(diào)用invalidateOptionsMenu()來請求系統(tǒng)調(diào)用onPrepareOptionsMenu()。 然后,您可以在方法中修改選項菜單。 您可以在[https://developer.android.com/guide/topics/ui/menus#options-menu]中查看Android文檔的“在運行時更改菜單項”部分,以了解更多詳細(xì)信息。
Dara answered 2020-08-07T00:17:05Z
總結(jié)
以上是生活随笔為你收集整理的android 动态修改菜单,如何在Android的“选项”菜单上更改MenuItem?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据结构c语言版第16页,数据结构c语言
- 下一篇: android第三方登录appid,An