在Android 4.3中调用invalidateOptionsMenu()时的奇怪行为

时间:2013-10-21 20:12:28

标签: android menu menuitem

我有一个包含三个项目的菜单,每个项目都单独显示一个屏幕。我在第二个屏幕中调用invalidateOptionMenu()来刷新操作栏颜色。 颜色变化在4.1.2和4.3版本中都能很好地工作。

但是在Android 4.3上,当我调用它时,第一个屏幕的项目显示在第二个屏幕上。

这是我的代码(@Override public void onClick(View v):

                if (android.os.Build.VERSION.SDK_INT >= 11){
                final ActionBar actionBar = getActionBar();
                this.invalidateOptionsMenu();
                actionBar.setBackgroundDrawable(new ColorDrawable(Color.parseColor(couleur)));

            }

即使我在尝试不起作用后再尝试:

            final MenuItem saveNote = Menu.findItem(R.id.saveNote);
            final MenuItem removeNote = Menu.findItem(R.id.deleteNote);
            final MenuItem nouvelleNote = Menu.findItem(R.id.nouvelleNote);

            nouvelleNote.setVisible(false); //screen 1
            saveNote.setVisible(true); //screen 2
            removeNote.setVisible(false); //screen 3

以下是我如何覆盖onCreateOptionsMenu:

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
        Menu = menu;
        getMenuInflater().inflate(R.menu.pumpkin_note, menu);

        final MenuItem saveNote = Menu.findItem(R.id.saveNote);
        final MenuItem removeNote = Menu.findItem(R.id.deleteNote);
        final MenuItem nouvelleNote = Menu.findItem(R.id.nouvelleNote);

        nouvelleNote.setVisible(true);
        saveNote.setVisible(false);
        removeNote.setVisible(false);

        return true;
    }

1 个答案:

答案 0 :(得分:1)

在onCreateOptionsMenu中,您应该只是给菜单充气

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

在onPrepareOptionsMenu中,您应该通过某种条件更改菜单项可见性

public boolean onPrepareOptionsMenu(Menu menu) {    
            menu.findItem(R.id.saveNote).setVisible(isFirstScreen);
            menu.findItem(R.id.deleteNote).setVisible(isSecondScreen);;
            menu.findItem(R.id.nouvelleNote).setVisible(isThirdScreen);;
    }   

要更新菜单,您应该调用invalidateOptionMenu(),这会调用onPrepareOptionsMenu并重新菜单重绘