2017-12-29 35 views
0

私は再戦をすることができる2人のゲームを作っています。私はまた、各プレイヤーの得点を記録しています。これは私の再戦コードは次のようになります:アプリを再起動した後にスコアを記憶する方法は?

public void rematch(View view) { 
    Intent i = getBaseContext().getPackageManager() 
      .getLaunchIntentForPackage(getBaseContext().getPackageName()); 

    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    finish(); 
    startActivity(i); 

} 

上記のコードは、ユーザーが再戦ボタンをクリックしたときに呼び出されます。基本的にはアプリケーションを再起動するのは、私が持っているすべての変数をリセットするよりも簡単だからです。私は共有環境設定を使用しています

@Override 
protected void onStop() { 
    super.onStop(); 

    // We need an Editor object to make preference changes. 
    // All objects are from android.context.Context 
    SharedPreferences settings = getSharedPreferences(SCORES_NAME, 0); 
    SharedPreferences.Editor editor = settings.edit(); 

    editor.putInt("scoreOne", p1Score); 
    editor.putInt("scoreTwo", p2Score); 

    editor.commit(); 
} 

:とにかく、スコアを追跡するために、私はこのようなonStop()メソッドをオーバーライドしています。その後、私のonCreateメソッドでは、私はこのようにこれらの共有設定を取得する:

// Remember scores from previous games 
    SharedPreferences settings = getSharedPreferences(SCORES_NAME, 0); 
    p1Score = settings.getInt("scoreOne", 0); 
    p2Score = settings.getInt("scoreTwo", 0); 
    updateScores(); 

SCORES_NAMEは、このすべてが動作していない public static final String SCORES_NAME = "MyScores";

です。ゲームが再開した後の私の得点は常に0に戻っています。私はrematch()にインテントを追加しようと考えていましたが、私のonCreate()メソッドでこのインテントにアクセスする方法がわかりません。どんな助けでも大歓迎です!

@Override 
public void onSaveInstanceState(Bundle savedInstanceState) { 
    super.onSaveInstanceState(savedInstanceState); 
    // Save UI state changes to the savedInstanceState. 
    // This bundle will be passed to onCreate if the process is 
    // killed and restarted. 
    savedInstanceState.putInt("scoreOne", p1Score); 
    savedInstanceState.putInt("scoreTwo", p2Score); 

    // etc. 
} 

バンドルは、基本的にNVP(「名前と値のペアを」保存する方法です:あなたはonSaveInstanceState(Bundle savedInstanceState)を無効にし、このようなBundleパラメータに変更するアプリケーションの状態の値を記述する必要が

+0

SharedPreferencesの変数に以前に保存した値があることを確認しますか? – MyMy

+0

@Mayk私はこれを行う方法がわかりません。どうぞあなたは詳しく教えていただけますか? – Zelda

+0

以前にSharedPreferencesに保存した値を尋ねたときに、onCreateでアプリケーションを再起動した後に返される値を出力するように指示しました。例:System.out.println(p1Score);問題がどこから来るのかを知ろうとする。 – MyMy

答えて

0

)マップ、およびそれがonCreate()に渡されたとも、あなたがこのような値を抽出したいonRestoreInstanceState()れます:

@Override 
public void onRestoreInstanceState(Bundle savedInstanceState) { 
    super.onRestoreInstanceState(savedInstanceState); 
    // Restore UI state from the savedInstanceState. 
    // This bundle has also been passed to onCreate. 
    int p1Score = settings.getInt("scoreOne", 0); 
    int p2Score = settings.getInt("scoreTwo", 0); 
} 

あなたは通常、あなたのAPPLのインスタンス値を保存するためにこのテクニックを使用します(選択、保存されていないテキストなど)。

+0

私はこれを試しましたが、うまくいかないようです。これらのメソッドは両方ともonCreate()の間に自動的に呼び出されますか?私はそれが自動であると仮定したので、onCreate()からそれらを呼び出さなかった。また、 'onRestoreInstanceState'メソッドのために、なぜそれが設定を使用していますか?それらはSharedPreferencesです... – Zelda

0

問題は、最初のアクティビティのonStop()の実行が完了した後に、新しいアクティビティのonCreate()が呼び出されるということです。

これは完全には関連していない2つの理由から、あなたが作成したがっている仮定ではないでしょう。

あなたは、コードを取る必要があり

public void onCreate(Bundle savedInstance) { 
    super.onCreate(); 
    .. 

    int p1Score = getIntent().getIntExtra("scoreOne", 0); 
    int p2Score = getIntent().getIntExtra("scoreTwo", 0); 
} 
0

を次のようにこれらの値を抽出することができますが、意図

public void rematch(View view) { 
    Intent i = getBaseContext().getPackageManager() 
      .getLaunchIntentForPackage(getBaseContext().getPackageName()); 

    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    // Those next values will be there for sure in the new activity. 
    i.putExtra("scoreOne", p1Score); 
    i.putExtra("scoreTwo", p2Score); 
    finish(); 
    startActivity(i); 
} 

にそして、あなたのActivityののonCreateで新たに作成された活動に必要な値を送りますonStopからfinish()に電話する前にrematchメソッドから実行してください。

private void saveScores() { 
    SharedPreferences settings = getSharedPreferences(SCORES_NAME, 0); 
    SharedPreferences.Editor editor = settings.edit(); 

    editor.putInt("scoreOne", p1Score); 
    editor.putInt("scoreTwo", p2Score); 

    editor.commit(); 
} 

そしてrematchからこの関数を呼び出します:このような

(...) 
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 

saveScores(); 

finish(); 
startActivity(i); 

しかし、@のelmorabeaのソリューションは優れている、あなたが今だけの活動の間の値を渡すためにSharedPreferencesを使用しています。

関連する問題