画面が回転した際に値を保持する - Android

Android端末において、画面が回転した場合Activityの再構築がされるためUIに設定した値が失われてしまう場合があります。UIに設定した値をBundleに保存して保持する方法を紹介します。

値が保持されない現象の確認

こちらの記事では、別のアクティビティからの戻り値をTextView に表示しますが、画面を回転するとActivityの再構築が行われるため、値が初期状態に戻ってしまいます。

以下のプロジェクトを作成し画面の回転時に値が初期化されることを確認します。

実装例

プロジェクト

  • Application Name: "RotateDemo"
  • Project Name: "RotateDemo"
  • Package Name: "com.iPentec.rotatedemo"
  • Minimum Required SDK: "API 8: Android 2.2 (Froyo)"
  • Target SDK: "API 17: Android 4.2 (Jelly Bean)"
  • Compile With: "API 17: Android 4.2 (Jelly Bean)"
  • Theme: "Holo Light with Dark Action Bar"

UIの作成

下図のUIを作成します。ButtonとTextViewを配置します。

コード

以下のコードを記述します。
MainActivity.java
package com.iPentec.rotatedemo;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.*;

public class MainActivity extends Activity {

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

  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
  }
  
  public void button1_onclick(View view){
    TextView textView1 = (TextView)findViewById(R.id.textView1);
    textView1.setText("テストメッセージ");
  }
}

解説

ボタンがタップされるとTextViewに"テストメッセージ"の文字を表示するコードです。

実行結果

プロジェクトを実行します。下図の画面が表示されます。


ボタンをタップするとTextViewに"テストメッセージ"の文字が表示されます。


画面を横向きにします。画面が回転しますが、TextViewに設定した文字は初期化されてしまいます。("Large Text"に戻ります。)


横向きでもボタンをタップすれば"テストメッセージ"の文字は表示されます。

Bundleへの値の保存

先のプロジェクトのMainActivity.javaに以下のコードを追記します。
MainActivity.java
package com.iPentec.rotatedemo;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.*;

public class MainActivity extends Activity {

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

  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
  }
  
  public void button1_onclick(View view){
    TextView textView1 = (TextView)findViewById(R.id.textView1);
    textView1.setText("テストメッセージ");
  }
  
  @Override
  protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);

    TextView textView1 = (TextView)findViewById(R.id.textView1);
    String value = textView1.getText().toString();
    outState.putString("TEXT_VIEW_STR", value);
  }
  
  @Override
  protected void onRestoreInstanceState(Bundle savedInstanceState) { 
    super.onRestoreInstanceState(savedInstanceState);
    
    String value = savedInstanceState.getString("TEXT_VIEW_STR"); 
    TextView textView1 = (TextView)findViewById(R.id.textView1);
    textView1.setText(value);
  }
}

解説

onSaveInstanceState
@Override
protected void onSaveInstanceState(Bundle outState) {
  super.onSaveInstanceState(outState);

  TextView textView1 = (TextView)findViewById(R.id.textView1);
  String value = textView1.getText().toString();
  outState.putString("TEXT_VIEW_STR", value);
}
上記は、画面の回転やアプリケーションがバックグラウンドになった後メモリの不足等でインスタンスが破棄される場合など、情報の保存が必要になった際に呼び出されるメソッドです。

  TextView textView1 = (TextView)findViewById(R.id.textView1);
  String value = textView1.getText().toString();
にてTextViewの値を取得します。

  outState.putString("TEXT_VIEW_STR", value);
BundleクラスのputString()メソッドを呼び出し値を保存します。第一引数は値のキーを与えます。第二引数に保持する値を与えます。
onRestoreInstanceState
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) { 
  super.onRestoreInstanceState(savedInstanceState);
    
  String value = savedInstanceState.getString("TEXT_VIEW_STR"); 
  TextView textView1 = (TextView)findViewById(R.id.textView1);
  textView1.setText(value);
}
上記は、画面の回転が終了し情報を復元する際やアプリケーションがフォアグラウンドに戻る際に情報の復元が必要となる場合に呼び出されるメソッドです。

  String value = savedInstanceState.getString("TEXT_VIEW_STR"); 
getString()メソッドを呼び出し保存された値を取り出します。第一引数には値の保存時に与えたキーを与えます。

  TextView textView1 = (TextView)findViewById(R.id.textView1);
  textView1.setText(value);
Bundleから取り出した値をTextViewに設定します。

実行結果

プロジェクトを実行します。ボタンをタップしTextViewに"テストメッセージ"を表示させた状態で画面を回転させます。


画面回転後もTextViewに値が保持されています。

補足

下図のようにEditTextを配置した場合の動作を確認します。


EditTextに値を入力します。


画面を回転します。画面回転後もEditTextには先ほど入力された文字列が保持されています。


EditTextの場合は画面が回転した際にも値が保持されていることがわかります。


著者
iPentecのプログラマー、最近はAIの積極的な活用にも取り組み中。
とっても恥ずかしがり。
最終更新日: 2024-01-04
作成日: 2013-04-17
iPentec all rights reserverd.