Android和ActionBarCompat:如何在pre-ICS设备上更改运行时操作的可见性?

时间:2012-03-15 00:04:46

标签: android android-actionbar

我有一个Activity extends ActionBarActivity取自ActionBarCompat代码示例,我试图在运行时显示/隐藏菜单项(操作)。

我已尝试在setVisible()上使用MenuItem并适用于ICS,但在ICS之前,它只会更改菜单项的可见性(菜单按钮按下),而ActionBar不会收到菜单更改通知。

任何解决方案?提前谢谢!

3 个答案:

答案 0 :(得分:5)

我在/ res / menu /下创建了多个操作栏项的替代项。我让一名成员指出我现在正在使用哪一个。要更换菜单,我打电话:

protected void setMenuResource(int newMenuResourceId)
{
    _menuResource = newMenuResourceId;
    invalidateOptionsMenu();
}

我将onCreateOptionsMenu()覆盖为:

@Override
public boolean onCreateOptionsMenu(Menu menu)
{
    if (_menuResource != 0)
    {
        getSupportMenuInflater().inflate(_menuResource, menu);
        return true;
    }
    return super.onCreateOptionsMenu(menu);
}

现在,如果我想更改动作项目,我打电话:

setMenuResource(R.menu.actionbar_menu_X);

答案 1 :(得分:4)

这就是我解决它的方法:

在actionbarcompat项目的ActionBarHelperBase.java中

...

private View addActionItemCompatFromMenuItem(final MenuItem item) {

final int itemId = item.getItemId();

...

此类的创建者复制了对象的属性,但没有复制item的id,因此以后用fiven id找不到它。

所以我在那个方法中添加了它:

...
actionButton.setId(itemId);
...

和我在同一个班级中使用:

@Override
public void hideMenuItemById(int id, boolean show){
    getActionBarCompat().findViewById(id).setVisibility(show? View.VISIBLE: View.GONE);
}

希望它可以帮到你。

答案 2 :(得分:3)

您必须调用supportInvalidateOptionsMenu(),这是ActionBarActivity的相关方法:

http://developer.android.com/reference/android/support/v7/app/ActionBarActivity.html#supportInvalidateOptionsMenu()