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

发布于 2024-12-12 11:13:49 字数 225 浏览 0 评论 0原文

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

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

有人有解决办法吗?

What I need:
Create an options menu with "Sign in" option, when user signs in it needs to change to "Sign Out" when user taps on the menu button again

When using a pure SDK i can just change the menu options in onPrepareOptionsMenu
the same works when using compatibility library v4
however when using ActionBarSherlock the menu won't update in onPrepareOptionsMenu; it still gets called, but the menu shown does not change.

Does anyone have a solution to this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

看轻我的陪伴 2024-12-19 11:13:49

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

if (mOptionsMenuInvalidated) {

行及其相应的右括号,因此每次都会执行该块。
如果您正在使用 FragmentMapActivity 活动,请在其中执行相同的操作。

Yeah, this is a nasty bug in ABS.
You can fix it like this:
In FragmentActivity.java find onPrepareOptionsMenu(android.view.Menu menu) method and comment out or delete

if (mOptionsMenuInvalidated) {

line and it's corresponding closing bracket, so this block gets executed every time.
Do the same in the FragmentMapActivity activity, if you are using it.

倾其所爱 2024-12-19 11:13:49

该线程有点旧,我无法应用建议的修复(或找到更好的修复)。我正在使用 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;

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

This thread is a bit old and I wasn't able to apply the suggested fix (or find a better one). I am using ActionBarSherlock 4.2 but I still have an issue when signing in on ICS devices where the options menu is an overlay: I couldn't figure out how to force invalidating the menu only AFTER the sign-in activity closes (and the app has determined the signed in state changed).

I resolved the issue with a flag to invalidate the menu onResume. I feel like using a flag is a hack, but it's better than invalidating on every resume.

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

Then in onOptionsItemSelected I set the flag:

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

This is working for me but I'm curious to hear if others have solved it a better way.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文