0

私はAndroid開発の初心者ですので、ご容赦ください。

これは、単純な「モグラたたき」ゲームを書くという私の悲しい試みです。UIは、キャプションのない9つのボタンで構成されています。タイマーは、ユーザーがクリックする必要のあるボタンの1つをランダムに選択します(ボタンにはキャプション「X」が付けられます)。ユーザーが正しいボタンを選択すると、10ポイントを獲得します。ボタンが時間内にクリックされなかった場合(または間違ったボタン)、スコアから10ポイントが差し引かれます。

ご覧のとおり、各ボタンにOnClickListenerを追加し、onCreate-Methodでその最初のキャプション( "Button1"、 "Button2" ...)を削除します。アプリを終了してからアプリに戻るまで、すべてが正常に機能しているように見えます。すべてのボタンに突然最初のキャプションが再び表示されます。タイマーは引き続き実行されますが(スコアは毎秒減少します)、ボタンはいずれも変更されなくなります。

これはおそらくアクティビティのライフサイクルと関係があることがわかり、すでに読んでいます。残念ながら、私の英語は上手ではなく、概念を理解するのに少し苦労しています。たぶん誰かがこれを簡単な言葉で私に説明してくれるでしょうか?

public class MainActivity extends Activity {

private static int[]        buttons     = {R.id.button1, R.id.button2, ...};
private static List<Button> buttonlist  = new ArrayList<Button>();

private static TextView     scoreboard;
private static Timer        timer = new Timer();
private static int          score;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    scoreboard = (TextView) findViewById(R.id.textView1);

    for (int i = 0; i < 9; i++) {
        buttonlist.add((Button) findViewById(buttons[i]));
        buttonlist.get(i).setText("");

        // add OnClickListener for each Button
        ((Button) buttonlist.get(i)).setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                //if correct Button is pressed add 20 to score 
                if ("X".equals(((Button) v).getText().toString())) {
                    score += 20;
                    //and set button-text to "" again ...
                    ((Button) v).setText("");
                }
                else {
                    score -= 10;
                }
            }
        });

    }
    // Start Game
    timer.schedule(new MyTimerTask(), 0, 1000);
}

private class MyTimerTask extends TimerTask {
    @Override
    public void run() {
        runOnUiThread(new Runnable() {
            public void run() {
                score -= 10;
                scoreboard.setText("Your Score: " + score);

                //clear buttons
                for (int i = 0; i < 9; i++)
                    buttonlist.get(i).setText("");

                //pick random button as next target
                buttonlist.get((int) (Math.random() * (9 - 1) + 1)).setText("X");
            }
        });
    }
}



@Override
protected void onResume() {
    super.onResume();
    // Do something here?
}


...
4

1 に答える 1

1

アクティビティを終了すると、システムはアクティビティで次のメソッドを呼び出します。

onPause onStop onDestroy

アクティビティクラスインスタンスは破棄されます

アクティビティを再度入力すると、アクティビティが再度作成され、次のメソッドが呼び出されます。

onCreate onStart onResume

これはあなたの場合の活動ライフサイクルがどのように見えるかです(もう少し詳細があります)

あなたの問題は、あなたのbuttonListがタイマーとスコアとともに静的であるということです。アプリを終了しても、システムがアプリプロセスを破棄することはないため、すべての静的変数は変更されません。これは、ボタンリストに前のアクティビティインスタンスのボタンが最初に含まれることを意味します。

解決策は、静的キーワードを使用しないことです。アクティビティを終了した後も状態を保持したい場合は、onSaveInstanceStateを調べてください。また、デバイスが回転できると仮定すると、これによってアクティビティも再作成されます。

于 2013-01-11T01:19:44.007 に答える