Как я могу изменить MenuItem в меню опций на Android?
У меня есть меню опций на моем 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
Для этого типа операций я обычно предпочитаю не изменять элементы меню, а просто скрывать те, которые вам не нужны:
@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;
}
Ответ 2
Ответ Flygenring верен, но menu.findItem() отстает и вызывает его внутри onPrepareOptionsMenu (меню меню) создает плохой пользовательский интерфейс. Лучше получить объект MenuItem один раз при создании меню, а затем просто вызвать 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 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;
}
Ответ 3
Вам, вероятно, нужно будет вызвать super.onPrepareOptionsMenu после того, как вы закончите внесение изменений. Из docs:
Производящие классы должны всегда вызывать до базового класса реализация.
Ответ 4
Я получил решение. Вы в основном удаляете MenuItem
при вызове removeItem()
, также удаляя ссылку. Использование этого кода работает.
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 файла меню.
Ответ 5
спасибо за информацию в этом посте, так как она решила мою проблему с ложными ярлыками в моем меню. Мне пришлось немного изменить его и иметь окончательный код, который хорошо работает в следующем, в надежде, что он спасет кого-то еще некоторое время и разочарование. Это немного другое решение, но основное изменение, которое я сделал, это .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;
}