2010年10月3日日曜日

Android Configuration Change

Configuration が変わったことをハンドルしたい場合、

AndroidManifest.xml の <activity> タグに

 android:configChanges

を設定すると、configuration が変わったときに、

 public void onConfigurationChanged(Configuration newConfig)

が呼ばれます。(Android 画面の縦横切り替え時に元の画面を保存)
例えば、

 android:configChanges="orientation"

とすると、画面が回転したときに onConfigurationChanged
が呼ばれます。

 getResources().getConfiguration()

で取得しておいた Configuration と 引数の newConfig の diff
をとることで、変化した configuration parameter の bit field
が取得できます。

しかし、この configChanges 設定をすると、Activity が再生成
されなくなるため(= onDestroy(), onCreate() は呼ばれなくなるため)、
画面のレイアウトが変わらない場合にはいいのですが、
縦横で画面のレイアウトを変えたい場合には使えません。

この設定をしない (= onConfigurationChanged が呼ばれない)
場合は、

 onDestroy() の中で、getChangingConfigurations()

を呼ぶことで、どの Configuration の変化によって
Activity が終了しようとしているかを検知することができます。

このメソッドの戻り値が変化した configuration parameter の
bit field になります。この bit field は ActivityInfo class
の Constants で定義されています。
ちなみに、orientation change の場合の戻り値は 128 =(0x00000080) です。

bit maskvalue
CONFIG_MCC1 (0x00000001)
CONFIG_MNC2 (0x00000002)
CONFIG_LOCALE4 (0x00000004)
CONFIG_TOUCHSCREEN8 (0x00000008)
CONFIG_KEYBOARD16 (0x00000010)
CONFIG_KEYBOARD_HIDDEN32 (0x00000020)
CONFIG_NAVIGATION64 (0x00000040)
CONFIG_ORIENTATION128 (0x00000080)
CONFIG_SCREEN_LAYOUT256 (0x00000100)
CONFIG_UI_MODE512 (0x00000200)
CONFIG_FONT_SCALE1073741824 (0x40000000)



@Override
public void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy()");
Log.d(TAG, "isFinishing : " + isFinishing());
int change = getChangingConfigurations();
Log.d(TAG, "getChangingConfigurations() :" + change + " (" + String.format("0x%08x", change) + ")");
}

0 件のコメント:

コメントを投稿