我需要什么: 使用“登录”选项创建一个选项菜单,当用户登录时,当用户再次点击菜单按钮时需要更改为“退出”
使用纯SDK时,我只需更改onPrepareOptionsMenu中的菜单选项即可 使用兼容性库v4时同样有效 但是当使用ActionBarSherlock时,菜单不会在onPrepareOptionsMenu中更新;它仍然被调用,但显示的菜单不会改变。
有没有人有解决方案?
答案 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;
这对我有用,但我很想知道其他人是否更好地解决了这个问题。