libro
www.tuyano.com
Google androidプログラミング入門

画面表示について考える (2/6)

作成:2010-06-18 14:37
更新:2010-06-18 14:40

■onSaveInstanceStateとonRestoreInstanceStateイベント

では、画面が回転した時の処理はどうすればよいのでしょうか。これは、Activityに最初から組み込まれている「インスタンスの保存とレストア」に関するイベントを利用します。ActivityやViewなどの部品類では、インスタンスを保存したり、保存された状態から復帰させる際に、以下のようなイベントが発生し、ハンドラメソッドが呼び出されます。

※インスタンスの保存時
@Override
protected void onSaveInstanceState(Bundle outState){
    ……必要な情報をBundleに保存する……
}

※インスタンス復帰時
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState){
    ……Bundleから必要な情報を取得し設定する……
}
画面を回転させるイベントが発生すると、Androidはまず表示されている部品類のonSaveInstanceStateメソッドを呼び出します。ここで、必要な情報を引数に渡された「Bundle」というクラスのインスタンスを使って保管してから、画面に表示されている部品類が一度画面から外され消えます。そして新たに回転された状態でそれらの部品が用意されます。この時、再びイベントが発生し、「onRestoreInstanceState」メソッドが呼び出されます。ここで必要な情報を取り出して部品類に設定し、この作業が完了したところで画面に表示されます。

実際に、これらのイベントを使ったサンプルを下に掲載しておきましょう。これは、回転時にTextViewの表示テキストを保存し、その値をもとに部品類を再現するサンプルです。わかりやすいように、保存するテキストは「○○(回転前に保存)」というように簡単なメッセージを付け足すようにしてあります。

実際にこのプログラムを動かし、画面を回転させてみてください。回転後、TextViewに表示されるメッセージは、末尾に「(回転前に保存)」というテキストを付け足した状態で復帰します。

※Bundleへの値の保存と取り出し

ここでは、onSaveInstanceState時にTextViewのテキストを保存し、onRestoreInstanceState時に保存したテキストを取り出してTextViewを再現しています。

この2つのメソッドでは、いずれも「Bundle」クラスのインスタンスが引数として渡されます。このクラスは様々な値のマッピングを管理するもので、このBundleに用意されているメソッドを呼び出して値を保管したり取り出したりすることができます。ここでは、以下のようなメソッドを使ってますね。

[Bundle].putString( キー, 値 );
String 変数 = [Bundle].getString( キー );
Bundleでは、値を「キー」で管理しています。特定のキーを指定して値を保管し、取り出すときはそのキーで値を検索します。ここでは「putString」でTextViewのテキストを"MESSAGE"というキーに保管し、「getString」それを取り出してから再びTextViewに設定しています。こうすることで、TextViewのテキストを再現していたのです。

Bundleには、この他にも「getInt/putInt」「getFloat/setFloat」「getBoolean/setBoolean」というように、プリミティブタイプの値をget/putするためのメソッドが一通り揃っています。また、「getIntArray/putIntArray」というように、プリミティブタイプの値の配列を保管するためのものも用意されています。これらのメソッドを利用することで、プログラムの現状をすべて保存し再現するのです。

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

package jp.tuyano;

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

public class SampleApp extends Activity {
	private TextView text1;
	private EditText edit1;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		text1 = (TextView)this.findViewById(R.id.text);
		edit1 = (EditText)this.findViewById(R.id.edit);
		Button btn = (Button)this.findViewById(R.id.btn);
		btn.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				String s = "入力:" + edit1.getText();
				text1.setText(s);
			}
		});
	}

	@Override
	protected void onSaveInstanceState(Bundle outState) {
		super.onSaveInstanceState(outState);
		String s = (String)text1.getText() + "(回転前に保存)";
		outState.putString("MESSAGE", s);
	}
	
	@Override
	protected void onRestoreInstanceState(Bundle savedInstanceState) {
		super.onRestoreInstanceState(savedInstanceState);
		String s = savedInstanceState.getString("MESSAGE");
		text1.setText(s);
	}
	
}

※関連コンテンツ

「Google androidプログラミング入門」に戻る