我目前正在开发一款游戏,在实现 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() 但一定是做错了。任何帮助将不胜感激。使用布尔值来跟踪登录状态也根本没有改变行为。当相反的功能正常工作时,我无法弄清楚为什么“退出”按钮在用于退出并使“登录”按钮可见后不会隐藏。