Подтвердить что ты не робот

Первоначально скрытый элемент меню не отображается, когда вызывается 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, но показано то же поведение.

Спасибо!

4b9b3361

Ответ 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();