2016-07-26 10 views
0

私はjavaを使い慣れています。 OnSaveInstanceStateの変数をOnCreateに保存しようとしていますが、画面が回転しています。 savedInstanceStateバンドルに保存された値を記録しました。 画面が回転すると、OnCreate(Bundle savedInstanceState)のバンドル値はログに0として表示されますが、ログにはOnSaveInstanceStateの正しい値として表示されます。バンドルの値を失う

My活動Javaは

package com.hfad.stopwatch; 

import android.app.Activity; 
import android.os.Bundle; 
import android.os.Handler; 
import android.util.Log; 
import android.view.View; 
import android.widget.TextView; 

public class StopwatchActivity extends Activity { 

    private static final String TAG = StopwatchActivity.class.getSimpleName(); 
    private int seconds; 
    private boolean running; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_stopwatch); 
     if(savedInstanceState != null){ 
      Log.d(TAG, "onCreate() Restoring previous state"); 
      /* restore state */ 
      seconds = savedInstanceState.getInt("seconds"); 
      running = savedInstanceState.getBoolean("running"); 
      String tmpStr = String.valueOf(seconds); 
      Log.d(TAG,tmpStr); 
      Log.d(TAG, "onCreate() ending"); 
     } else { 
      Log.d(TAG, "onCreate() No saved state available"); 
      /* initialize app */ 
     } 
     runTimer(); 
    } 

    @Override 
    public void onSaveInstanceState(Bundle savedInstanceState){ 
     super.onSaveInstanceState(savedInstanceState); 
     Log.d(TAG,"onSaveInstanceState() saving state"); 
     savedInstanceState.putInt("Seconds", seconds); 
     savedInstanceState.putBoolean("running", running); 
     String tmpStr = String.valueOf(savedInstanceState.getInt("Seconds")); 
     Log.d(TAG,tmpStr); 
     Log.d(TAG,"onSaveInstanceState() ending"); 
    } 

    //Start the stopwatch running when the start button is clicked 
    public void onClickStart(View view){ 
     running = true; 
    } 

    //Stop the stopwatch running when the stop button is clicked 
    public void onClickStop(View view){ 
     running = false; 
    } 

    //Start the stopwatch running when the start button is clicked 
    public void onClickReset(View view){ 
     running = false; 
     seconds = 0; 
    } 

    private void runTimer(){ 
     final TextView timeView = (TextView)findViewById(R.id.time_view); 
     final Handler handler = new Handler(); 
     handler.post(new Runnable(){ 
      @Override 
      public void run(){ 
       int hours = seconds/3600; 
       int minutes = (seconds%3600)/60; 
       int secs = seconds%60; 
       String time = String.format("%d:%02d:%02d",hours,minutes,secs); 
       timeView.setText(time); 
       if(running){ 
        seconds++; 
       } 
       handler.postDelayed(this, 1000); 
      } 
     }); 
    } 

} 

これはログです。

07-26 21:02:19.880 6124-6124/com.hfad.stopwatch D/StopwatchActivity: onSaveInstanceState() saving state 

07-26 21:02:19.880 6124-6124/com.hfad.stopwatch D/StopwatchActivity: 11 

07-26 21:02:19.880 6124-6124/com.hfad.stopwatch D/StopwatchActivity: onSaveInstanceState() ending 

07-26 21:02:19.940 6124-6124/com.hfad.stopwatch D/StopwatchActivity: onCreate() Restoring previous state 

07-26 21:02:19.940 6124-6124/com.hfad.stopwatch D/StopwatchActivity: 0 

07-26 21:02:19.940 6124-6124/com.hfad.stopwatch D/StopwatchActivity: onCreate() ending 

私は本の中でレッスンを以下のんだけど、説明したように、これは動作しない、と私はオンライン解決策を見つけることができません。

+0

あなたはそれがあなたを助けている場合受け入れたとして答えの1をマークする必要があります。ご了承ください。 – Intern

答えて

1

保存する値を設定した後にsuper.onSaveInstanceState(savedInstanceState)に電話する必要があります。

あなたが値を見つけるために、間違ったキーを使用しているよりin the documentations

3

を見ることができます。あなたの鍵には大文字のSがあります。 Bundleのキーでは大文字と小文字が区別されます。

ここで、キーストリングを最終的な静的として宣言し、それらを使用してストアおよびリトリーブすることをお勧めします。例えば。

public static final String SECONDS_KEY = "seconds"; 
public static final String RUNNING_KEY = "running" 
+0

ありがとう、私はこれを念頭に置いておきます。 – fatmanming

1

バンドルは大文字と小文字を区別します。あなたは "秒"を入れて "秒"を取得しています。このような間違いを経験しないように、キーを定数として定義することをお勧めします。

Bundle - is key case sensitive?

+0

ありがとう、次の例では、私は誤植に盲目的になります。 – fatmanming

関連する問題