0

我目前正在开发一款游戏,在实现 Google Play 游戏服务后,我发现自己需要一个动态选项菜单。我的整个游戏由 strings.xml 和 6 个活动组成(不包括导入的库项目)。我提到这一点只是因为这意味着我正在构建选项菜单而不使用 layout.xml。

我想要完成的是根据用户登录状态更改我的登录和注销按钮的可见状态。目前,当用户登录时,菜单会正确更新,并且登录按钮会被注销。但是,当单击“退出”按钮时,虽然它确实将用户正确退出,但不会触发菜单更新。尝试通过按钮再次注销会导致应用程序崩溃,因为我没有捕获异常,我可以稍后处理。如果您更改活动,菜单会正确更新。

到目前为止,我所得到的看起来与我在这里发现的非常相似

这是我的扩展类,所有其他类都扩展它以使用整个游戏中常见的方法,我已经剥离了与菜单无关的项目。

package com.domain.myapp;

import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.Build;
import android.view.Menu;
import android.view.MenuItem;

public abstract class Extensions extends LicenseCheck {
    private static final int SOM1= 1;
    private static final int SOM2= 2;
    private static final int SOM3= 3;
    private static final int SOM4= 4;
    private static final int SOM5= 5;
    private static final int SOM6= 6;

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        if (Build.VERSION.SDK_INT >= 11) {
            buildMenu(menu);
        }
        return true;
    }

    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        if (Build.VERSION.SDK_INT < 11) {
            buildMenu(menu);
        }
        return true;
    }

    private void buildMenu(Menu menu) {
        menu.clear();
        menu.add(Menu.NONE, SOM1, Menu.NONE, "Instructions");
        menu.add(Menu.NONE, SOM2, Menu.NONE, "View Achievements");
        menu.add(Menu.NONE, SOM3, Menu.NONE, "View Leaderboard");
        menu.add(Menu.NONE, SOM4, Menu.NONE, "Sign In");
        menu.add(Menu.NONE, SOM5, Menu.NONE, "Sign Out");
        menu.add(Menu.NONE, SOM6, Menu.NONE, "Exit Game");
        if (isSignedIn()) {
            menu.findItem(SOM4).setVisible(false);
            menu.findItem(SOM5).setVisible(true);
        }
        if (!isSignedIn()) {
                menu.findItem(SOM4).setVisible(true);
                menu.findItem(SOM5).setVisible(false);
        }
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case SOM1:
            Intent nextInstructionScreen = new Intent(getApplicationContext(), InstructionScreen.class);
            startActivity(nextInstructionScreen);   
            break;
        case SOM2:
            viewAchievements();
            break;
        case SOM3:
            viewLeaderboards();
            break;
        case SOM4:
            beginUserInitiatedSignIn();
            break;
        case SOM5:
            getGamesClient().signOut();
            menuRefresh();
            break;
        case SOM6:
            moveTaskToBack(true);
            break;
        }
        return super.onOptionsItemSelected(item);
    }

    @SuppressLint("NewApi")
    public void menuRefresh() {
        if (Build.VERSION.SDK_INT >= 11) {
            invalidateOptionsMenu();
        }
    }
}

此外,我花了一些时间尝试使用 onSignOutComplete() 但一定是做错了。任何帮助将不胜感激。使用布尔值来跟踪登录状态也根本没有改变行为。当相反的功能正常工作时,我无法弄清楚为什么“退出”按钮在用于退出并使“登录”按钮可见后不会隐藏。

4

1 回答 1

0

就个人而言,我会坚持只使用onCreateOptionsMenu()和删除该onPrepareOptionsMenu()方法。

onPrepareOptionsMenu()每次显示菜单时调用,而onCreateOptionsMenu()仅在最初创建菜单和手动调用时调用invalidateOptionsMenu()

另外,我不是先添加两个菜单项然后删除/隐藏其中一个,而是检查用户是否登录,然后添加适当的菜单。

除此之外,虽然它确实与您的问题无关,但您应该使用字符串资源而不是硬编码您的菜单项标题。检查您的res/values/strings.xml文件,然后使用getString(R.string.id_of_string)您的 Java 代码从那里获取字符串。

PS。我猜你的LicenseCheck课扩展了Activity

于 2013-06-26T15:59:50.640 回答