适用于 API < 11 的 Android invalidateOptionsMenu()

Posted

技术标签:

【中文标题】适用于 API < 11 的 Android invalidateOptionsMenu()【英文标题】:Android invalidateOptionsMenu() for API < 11 【发布时间】:2012-12-10 02:46:45 【问题描述】:

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

ActivityCompat.invalidateOptionsMenu(MainActivity.this)android 11+ 中运行良好。但是我可以为 android API

这在 Android API 11+ 中运行良好,使用 onPrepareOptionsMenuActivityCompat.invalidateOptionsMenu(MainActivity.this)。 问题是试图在 Android API

这是我的onPrepareOptionsMenu 方法:

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

【问题讨论】:

我建议您将方法更改为类似 @Override public boolean onPrepareOptionsMenu(Menu menu) menu.getItem(0).setEnabled(menuRefreshEnable);返回真; How to make a conditional invalidateOptionsMenu() call depending on the API level in Android?的可能重复 【参考方案1】:

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

【讨论】:

我需要在没有用户与菜单按钮交互的情况下更新菜单项。想象一下,当我的异步任务正在运行时,用户让菜单保持打开状态......使用该方法,菜单项会在 api 11+ 中自动更新。如果我删除它,它就不起作用。但我仍然需要在 android api 中自动更新菜单项 当我的异步任务完成时,我执行 ActivityCompat.invalidateOptionsMenu(MainActivity.this);为了更新菜单itens。但它只适用于 api 11+。如何在没有用户与菜单按钮交互的情况下强制在 api 几乎可以通过编程方式在设备上按两次菜单按钮 【参考方案2】:

API &lt; 11 上使用supportInvalidateOptionsMenu() 方法

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于适用于 API < 11 的 Android invalidateOptionsMenu()的主要内容,如果未能解决你的问题,请参考以下文章

适用于 Android 的 Google Places API 未显示

android.hardware.Camera 是不是仍然适用于所有 API 级别?

适用于 Android 的 Google API 缺少 Games.getGamesAuthToken

适用于 Android 的 Google Place API:无法使用 Place Picker 的选择器选择地点

适用于 Android 的 VoIP 库 [关闭]

适用于 Android 的天气 API [关闭]