画面回転への対応 - JPDialer残項目

 JPDialer残項目のまとめ。

  • アイコンを差し替える。Androidでは48x48ピクセルのアイコンが標準である。
  • 著作権表示画面のリンクがJPDialerのページを指すように修正する。現在はDialerのページを指している。
  • 画面回転に正しく対応させる。G1のキーボードをユーザーが出し入れしたときに、テキストフィールドの各項目が消えないようにする。

 一番最後の項目が一番手間が掛かる。ユーザーがキーボードを出し入れすると、Activityは破棄され、その後すぐに再生成される。(アプリケーション自体は破棄されない点に注意。)プログラマーからみるとこれはやりすぎの感があるが、Googleの考えは違う。

  1. キーボードの出し入れとそれに伴う画面の回転は構成変更である。
  2. 構成が変わるのだからActivityはそれに合わせて各パラメーター、とくにレイアウトを変更する必要がある。
  3. 故に、フレームワークは現在のActivityを破棄して、新しいインスタンスを生成し直す。これは、動的にActivityのパラメーターを更新するよりもずっと簡単である。

 ということである。よろしい。いずれにせよ、Activityはこの問題と関係なく、いつ破棄されてもいいようにonSaveInstanceState()コールバックで自身の内部状態を保存しなければいけないのだ。
 アプリケーションを画面回転に対応させるために、いくつかの方法がある。*1

  • onSaveInstanceState()で状態を保存して、onCreate()またはonRestoreInstanceState()コールバックの中で、保存した状態に復帰させる。これは前述のように、Activityの状態を保存する通常のやり方である。
  • 代わりにonRetainNotConfigurationInstance()を使って内部状態を保存する。これこそが構成変更時にActivityの状態を保存するために用意されたコールバックで、onSaveInstanceState()と違って任意のObjectインスタンスを保存できる。Bundleクラスに限定されることがないので、より柔軟な処理が出来る。
  • さらに柔軟な方法として、フレームワークに対して、自分で構成変更に対処すると宣言することができる。アプリケーションのmanifestファイルの、該当するActivityの属性として、 という項目を追加する。こうすることで、キーボードの出し入れと画面変更のときにはActivityは破棄されず、代わりにonConfigurationChange()コールバックが呼ばれるようになる。このコールバックの中で、画面をレイアウトし直せばよい。

 JPDialerがAndroidアプリケーションとして正しく振る舞うためには、最低限、最初の選択肢を実装する必要がある。その上で、より効率的な処理として、三つ目の選択肢も実装する予定である。

*1:これ以外の選択肢とより詳細な説明がAndroidGuysというサイトで紹介されている。http://androidguys.com/?s=Rotational+Forces&x=0&y=0