Первоначально скрытый элемент меню не отображается, когда вызывается SetVisible (true)
У меня есть основная проблема, когда изначально скрытый MenuItem не может быть переключен на видимый. В качестве предостережения я использую ActionBarSherlock, но мне хотелось узнать, знает ли кто-нибудь, была ли это известная проблема Android, или я делаю что-то ужасное, прежде чем исследовать, является ли это проблемой внутри ABS. Код выглядит следующим образом:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getSupportMenuInflater();
inflater.inflate(R.menu.menu_xml, menu);
mMenuItem = menu.findItem(R.id.menu_item);
mMenuItem.setVisible(false);
return true;
}
// Somewhere elsewhere
// MenuItem is never visible after this line is executed
mMenuItem.setVisible(true);
Я также попытался переместить назначение mMenuItem и видимость в вызов onPrepareOptionsMenu, но показано то же поведение.
Спасибо!
Ответы
Ответ 1
Проблема в том, что вы не говорите Android, что ему нужно обновить меню. Это заставило меня замочить в течение последнего часа, пока я не выяснил решение. Я не думаю, что это очевидно на pre-HC, потому что пункты меню не всегда видны на экране, как в HC +.
В своей деятельности просто позвоните:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
this.invalidateOptionsMenu();
}
Это вызовет вызов для события onCreateOptionsMenu() еще раз, поэтому, если вы установите видимость в этой функции для инициализации, вам нужно будет принять во внимание тогда, если вы хотите, чтобы опция показывалась или нет.
Ответ 2
У меня была та же проблема, и я узнал, что setVisible(true)
работает, когда имеется хотя бы один MenuItem
. Надеюсь, это может быть полезно кому-то.
Ответ 3
Я обнаружил, что использование метода show post (Runnable) для setVisible делает трюк, поэтому что-то вроде...
view.post(new Runnable() {
@Override
public void run() {
menu.findItem(id).setVisible(true);
}
});
Ответ 4
Я понимаю, что это старый вопрос.
Но я решил это, разместив внутри onPrepareOptionMenu() {...}
private boolean mShowVisible=false;
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
menu.findItem(R.id.menu_item).setVisible(mShowVisible);
return super.onPrepareOptionsMenu(menu);
}
когда вы хотите установить видимый или не просто называть его следующим:
mShowVisible = true; // or false
invalidateOptionMenu();