2

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

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

有人对此有解决方案吗?

4

2 回答 2

3

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

if (mOptionsMenuInvalidated) {

行和它对应的右括号,所以这个块每次都会被执行。如果您正在使用 FragmentMapActivity 活动,请执行相同的操作。

于 2011-11-11T12:09:05.060 回答
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;

这对我有用,但我很想知道其他人是否以更好的方式解决了它。

于 2013-03-14T14:09:50.057 回答