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