我需要什么:创建一个带有“登录”选项的选项菜单,当用户登录时,当用户再次点击菜单按钮时,它需要更改为“退出”
使用纯 SDK 时,我可以只更改 onPrepareOptionsMenu 中的菜单选项,使用兼容性库 v4 时相同,但是使用 ActionBarSherlock 时,菜单不会在 onPrepareOptionsMenu 中更新;它仍然被调用,但显示的菜单没有改变。
有人对此有解决方案吗?
我需要什么:创建一个带有“登录”选项的选项菜单,当用户登录时,当用户再次点击菜单按钮时,它需要更改为“退出”
使用纯 SDK 时,我可以只更改 onPrepareOptionsMenu 中的菜单选项,使用兼容性库 v4 时相同,但是使用 ActionBarSherlock 时,菜单不会在 onPrepareOptionsMenu 中更新;它仍然被调用,但显示的菜单没有改变。
有人对此有解决方案吗?
是的,这是 ABS 中的一个令人讨厌的错误。您可以像这样修复它:在 FragmentActivity.java 中找到 onPrepareOptionsMenu(android.view.Menu menu) 方法并注释掉或删除
if (mOptionsMenuInvalidated) {
行和它对应的右括号,所以这个块每次都会被执行。如果您正在使用 FragmentMapActivity 活动,请执行相同的操作。
该线程有点旧,我无法应用建议的修复(或找到更好的修复)。我正在使用 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;
这对我有用,但我很想知道其他人是否以更好的方式解决了它。