カスタマイズDialog と画面回転

カスタマイズDialog を作った時、( android.app.Dialog を継承 )そのままでは
レイアウトが画面の回転に対して対応できないものにならざる得ないケースがあると思う。

画面の向きに合わせて、width , height のサイズ調整をすれば済むのがほとんどであろう。

Dialog インスタンスだけで画面の向きの変化を知ることはできなく、
Activity から調整することになる。

Dialog を表示しているActivityで、onConfigurationChanged をオーバーライドし
そこから、Dialog インスタンスに対して、サイズ調整するだけなので、
コードの単純さを大事にするなら、Activity で、Dialog インスタンスグローバル変数
スコープにして、ほぼ普遍性のあるコードになってくる。


// グローバル変数
Dialog mDialog;  


@Override
public void onConfigurationChanged(Configuration newConfig){
   super.onConfigurationChanged(newConfig);

   if (mDialog != null){
      // ダイアログにサイズ再設定値は、
      // 下記の任意メソッド getLayoutParamsForDialog を呼ぶことで実行する。


      mDialog.getWindow().setAttributes(getLayoutParamsForDialog(mDialog, newConfig));

   }
}

protected WindowManager.LayoutParams getLayoutParamsForDialog(Dialog dialog, Configuration config){

   DisplayMetrics metrics = getResources().getDisplayMetrics();

   WindowManager.LayoutParams layoutParams = dialog.getWindow().getAttributes();

   if (config.orientation==Configuration.ORIENTATION_PORTRAIT){
      layoutParams.width = (int)(metrics.widthPixels * 0.9);
      layoutParams.height = (int)(metrics.heightPixels * 0.8);
   }else if(config.orientation==Configuration.ORIENTATION_LANDSCAPE){
      layoutParams.width = (int)(metrics.widthPixels * 0.9);
      layoutParams.height = (int)(metrics.heightPixels * 0.7);
   }
   return layoutParams;
}

忘れてならないのは、AndroidManifest.xml で、ダイアログを表示する Activity の属性、
 android:configChanges に、orientation を付与することである。
キーボードの出現でも画面サイズが変わってしまうので、
  android:configChanges="keyboardHidden|orientation" と書く。