AppCompatとDialogFragmentのあれこれ

いつからかは判らないが、AlertDialogをbuilderからではなく、どうもFragmentから使えとのGoogle先生からのお達しが下っていたが、
正直別にAlertDialogなんてほんとにYesとかNoとかしか使うようなことが無かったので今まで無視して来た。

ただ、やはり新しいものを作る際に古い仕様ばかりに頼っているのはよくないということで、DialogFragmentに全面的に移行することにした。
ちなみに、同時に巷で噂のAppCompatについて前回の記事で書いたが、
実はこのTheme.AppCompatはDialogのStyleを一切含んでいない。

参考:http://y-anz-m.blogspot.jp/2013/10/appcompat-dialog.html

そのため、DialogのStyleを全て書くことになるのだが、Holo等を使うよりも、

    <style name="MyDialogTheme" parent="@android:style/Theme.Light">
        <item name="android:windowNoTitle">true</item>
    </style>

こういう形でまっさらな状態にしてしまい、

public static class DialogFragmentCustom  extends DialogFragment{

	Context mContext;
	@Override
	public View onCreateView(LayoutInflater inflater, 
				ViewGroup container, Bundle savedInstanceState) {
		View content = inflater.inflate(R.layout.fragment_dialog_custom, null);
		//ダイアログの中に入るというか、上に乗るlayoutの指定。
		//dialog自体は下のoverrideしたdialogで生成。その際にdialogのオプションをいろいろ指定する。
		return content;
	}    
	@Override
	public Dialog onCreateDialog(Bundle savedInstanceState) {
		Dialog dialog = new Dialog(getActivity(),R.style.MyDialogTheme);
		//ダイアログの背景を完全に透過。
		dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
		//フルスクリーンでダイアログを表示。
		dialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
		WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN);
		dialog.setCanceledOnTouchOutside(false);
		return dialog;
	}
}
		

あとはまぁ、R.layout.fragment_dialog_customでうまいことレイアウトを指定してやるのが一番スマートだと感じた。
好きにデザインできるし。
AppCompatを使っている際は、DialogFragmentでActionBarも使えないようなので、結局自身でViewでゴリゴリ書いたほうが良さそう。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です