2010年3月18日木曜日

Android 画面の縦横切り替え時に元の画面を保存

画面の縦横が切り替わると、Activity は一度終了(onPause(), onStop(), onDestroy() )させられちゃいます。
(Activity が foreground や visibleだった時は、新たなインスタンス(前のインスタンスがonSaveInstanceState メソッドで作った savedInstance を伴って)が作られます)

どうしてそうなるかと言うと、
 デバイスのコンフィグレーション(画面の向き、入力デバイス、言語など)
 が変更されたら、UIはそのコンフィグレーションにマッチするように更新
 する必要があるからなんです。
 例えば、縦用のレイアウトと横用のレイアウトが用意されている場合は、
 リソースの再取得が必要になりますよね。

でも、コンフィグレーションの変更があっても Activity の再スタートしたくない場合はどうすればいいのでしょう?

その場合は AndroidManifest.xml の activity タグに

android:configChanges=["mcc", "mnc", "locale",
           "touchscreen", "keyboard",
           "keyboardHidden",
           "navigation", "orientation",
           "fontScale"]

を追加します。
複数指定する場合は "|" でつなぎます。こんな感じ。
"locale|navigation|orientation"

"mcc"
  IMSI mobile country code (MCC) が変わったとき
  (つまり、SIMが検出されて、MCCがアップデートされたとき)

"mnc"
  IMSI mobile network code (MNC) が変わったとき
  (つまり、SIMが検出されて、MNCがアップデートされたとき)

"locale"
  ロケールが変わったとき(例えば、言語を変えたとき)

"touchscreen"
  タッチスクリーンが変わったとき(通常は呼ばれることはない)

"keyboard"
  キーボードのタイプが変わったとき
  (例えば、外部キーボードを接続したとき)

"keyboardHidden"
  キーボードへのアクセスが変わったとき
  (例えば、ハードキーボードをスライドインしたとき(とか))

"navigation"
  ナビゲーションタイプが変わったとき(通常は呼ばれることはない)

"orientation"
  画面の縦横が切り替わったとき

"fontScale"
  フォントサイズが変更されたとき

ここで宣言した種類のコンフィグレーションの変更があると、アクティビティは再スタートされる代わりに onConfigurationChanged が呼ばれます。



参考ページはここです。
 ・Handling the Configuration Change Yourself
 ・Android SDK WG 第1回 セッション(2008.10.25)
 ・http://developer.android.com/intl/ja/guide/topics/manifest/activity-element.html
 

エミュレータで画面の縦横を切り替えるには(ctrl + F12)です。
このときは、
 orientation と keyboardHidden (G1を意識している?)
の2つのコンフィグ値が変更になります

0 件のコメント:

コメントを投稿