Android 选项菜单赢得';使用ActionBarSherlock时不会动态更新

Android 选项菜单赢得';使用ActionBarSherlock时不会动态更新,android,actionbarsherlock,Android,Actionbarsherlock,我需要的是: 创建一个带有“登录”选项的选项菜单,当用户登录时,当用户再次点击菜单按钮时,它需要更改为“注销” 使用纯SDK时,我只需更改OnPrepareOptions功能表中的菜单选项 当使用兼容库v4时,同样的方法也适用 但是,当使用ActionBar Sherlock时,OnPrepareOptions功能表中的菜单不会更新;它仍然会被调用,但显示的菜单不会更改 有人能解决这个问题吗?是的,这是ABS中一个令人讨厌的错误。 您可以这样修复它: 在FragmentActivity.java

我需要的是: 创建一个带有“登录”选项的选项菜单,当用户登录时,当用户再次点击菜单按钮时,它需要更改为“注销”

使用纯SDK时,我只需更改OnPrepareOptions功能表中的菜单选项 当使用兼容库v4时,同样的方法也适用 但是,当使用ActionBar Sherlock时,OnPrepareOptions功能表中的菜单不会更新;它仍然会被调用,但显示的菜单不会更改


有人能解决这个问题吗?

是的,这是ABS中一个令人讨厌的错误。 您可以这样修复它: 在FragmentActivity.java中找到onPrepareOptions菜单(android.view.Menu菜单)方法并注释掉或删除

if (mOptionsMenuInvalidated) {
行及其对应的右括号,所以每次都会执行此块。
如果您正在使用FragmentMapActivity,请在该活动中执行相同操作。

此线程有点旧,我无法应用建议的修复(或找到更好的修复)。我正在使用ActionBarSherlock 4.2,但在登录选项菜单为覆盖的ICS设备时仍然存在一个问题:我不知道如何在登录活动关闭后强制使菜单无效(并且应用程序已确定登录状态已更改)

我用一个标志解决了这个问题,使恢复时的菜单无效。我觉得使用标志是一种攻击,但总比在每份简历上都作废要好

@Override
protected void onResume()
{
    if ( checkLoginState == Boolean.TRUE )
    {
        invalidateOptionsMenu();
        checkLoginState = Boolean.FALSE;
    }
    super.onResume();
}
然后在
onOptions ItemSelected
中设置标志:

@Override
public boolean onOptionsItemSelected( MenuItem item )
{
    // Handle item selection
    switch ( item.getItemId() )
    {
        case R.id.actionbar_settings_signin_out:
            if (isUserLoggedIn() == Boolean.TRUE )
            {
                logout();
                validateOptionsMenu();
            }
            else
            {
                // set the flag so that on resume we update the options menu
                checkLoginState = Boolean.TRUE;
                startSignInActivity();
            }
            return true;

这对我来说很有效,但我很想知道其他人是否有更好的解决方法。

这在ABS 4中似乎是固定的。记住在onTabSelected()中调用invalidateOptionsMenu(),以便告诉系统启动prepareoptionsmenu(),因为这是一个较老的问题,我将使用@larham1建议并假设它已修复。