适用于API <11的Android invalidateOptionsMenu()


76

我使用过ActivityCompat.invalidateOptionsMenu(MainActivity.this);这样,我的菜单项“刷新”可以自动启用/禁用,而无需使用“触摸菜单”选项(想象用户将菜单保持打开状态……我需要将“刷新”菜单项自动禁用和启用自身)。

ActivityCompat.invalidateOptionsMenu(MainActivity.this)Android中11+正常工作。但是我可以为android API <11使用什么?:S我已经搜索了很多,但是找不到答案。有人可以帮我吗?

使用onPrepareOptionsMenu和在Android API 11+中运行良好ActivityCompat.invalidateOptionsMenu(MainActivity.this)。问题试图在Android API <11中完成。

这是我的onPrepareOptionsMenu方法:

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    if(menuRefreshEnable){
        menu.getItem(0).setEnabled(true);
    }
    if(!menuRefreshEnable){
        menu.getItem(0).setEnabled(false);
    }       
    return true;
}

1
我建议您将方法更改为类似@Override public boolean onPrepareOptionsMenu(Menu menu){menu.getItem(0).setEnabled(menuRefreshEnable); 返回true;}
Alexander Zhak 2013年

Answers:



5

ActivityCompat.invalidateOptionsMenu()不回调onPrepareOptionsMenu();它,而是直接更新菜单。只需放一些Log.d()自己检查一下即可。

这对我有用(我正在使用API​​ 8):

private Menu mMenu;
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.track_fragment, menu);
    mMenu = menu;
    }
...
private void someMethod() {
...
    if (mMenu != null) {
       MenuItem item = mMenu.findItem(R.id.new_track);
       if (item != null) {
            item.setVisible(false);
            ActivityCompat.invalidateOptionsMenu(this.getActivity());
        }
    }
...
}

我已经someMethod()从几个地方打过电话,甚至没有onCreateOptionsMenu(),所以我必须检查一下mMenu != null


0

如果API大于或等于11并因此受支持,则返回true。在API 11之前,按下菜单按钮会绘制菜单,因此不需要此方法,因为它会自动发生。


1
我需要在没有用户与菜单按钮交互的情况下更新菜单项。想象一下,当我的异步任务运行时,用户让菜单保持打开状态...使用该方法,菜单itens在api 11+中会自动更新。如果我将其删除,则无法使用。但我仍然需要在菜单的自动更新android的API <11 itens
SnitramSD

2
当我的异步任务完成时,我执行以下代码行:ActivityCompat.invalidateOptionsMenu(MainActivity.this); 为了更新菜单itens。但它仅适用于api 11+。如何在没有用户与菜单按钮交互的情况下强制在api <11中更新菜单项(类似于api <11中的ActivityCompat.invalidateOptionsMenu(MainActivity.this);)?
SnitramSD

可以通过编程方式在<11的设备上按两次菜单按钮来完成。
AndroidPenguin 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.