使用ActionBarSherlock时,选项菜单不会动态更新

时间:2011-10-28 00:16:38

标签: android actionbarsherlock

我需要什么: 使用“登录”选项创建一个选项菜单,当用户登录时,当用户再次点击菜单按钮时需要更改为“退出”

使用纯SDK时,我只需更改onPrepareOptionsMenu中的菜单选项即可 使用兼容性库v4时同样有效 但是当使用ActionBarSherlock时,菜单不会在onPrepareOptionsMenu中更新;它仍然被调用,但显示的菜单不会改变。

有没有人有解决方案?

2 个答案:

答案 0 :(得分:3)

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

if (mOptionsMenuInvalidated) {

行,它是相应的右括号,所以每次执行此块。 如果您正在使用它,请在FragmentMapActivity活动中执行相同的操作。

答案 1 :(得分:1)

这个帖子有点陈旧,我无法应用建议的修复程序(或找到更好的修复程序)。我正在使用ActionBarSherlock 4.2但是在登录ICS设备时仍然存在问题,其中选项菜单是叠加:我无法弄清楚如何在登录活动关闭后强制使菜单无效(并且应用程序具有确定签约状态已更改)。

我通过一个标志来解决问题,使菜单onResume无效。我觉得使用旗帜是一种黑客行为,但它比在每份简历上失效更好。

@Override
protected void onResume()
{
    if ( checkLoginState == Boolean.TRUE )
    {
        invalidateOptionsMenu();
        checkLoginState = Boolean.FALSE;
    }
    super.onResume();
}

然后在onOptionsItemSelected中设置标志:

@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;

这对我有用,但我很想知道其他人是否更好地解决了这个问题。