どうも。どっことです。今回はActivity
をダイアログっぽく表示する方法を紹介します。
Activityをダイアログのように表示する
色々カスタマイズできるのは嬉しいDialogFragment
ですが、実装が面倒で「それっぽければActivity
で十分なんだよなぁ…」と思ってしまった私への、「Activity
だけでDialog
ぽい見た目の画面(というかダイアログ)の作り方」備忘録です。
最小限の設定の場合
対象のActivity
に以下のTheme
を設定するだけです。
Theme.MaterialComponents.DayNight.Dialog
DialogFragment
でStyle
として設定される値を、Activity
に設定してあげるだけです。本当にそれっぽくできるだけで、これだけだと決定もキャンセルもなにもないのでレイアウト側で追加の実装が必要となります。
色々カスタマイズしたい場合
Theme
を継承してカスタマイズします。
最低限の設定を参考にダイアログぽいものを実装するとテーマの設定が引き継がれていないため、他のActivity
と統一感が取れていないダイアログが表示されます。レイアウト側で調整すればなんとかなりますが、いい感じの統一感を目指すならTheme
を意識したカスタマイズが必要となります。
Theme.MaterialComponents.DayNight.Dialog
の継承元を追っていくと分かりますが、ダイアログぽいActivity
にしてくれるこのテーマはいくつかの属性が設定されています。以下抜粋。もしかしたら漏れてるかも。
<item name="android:windowFrame">@null</item>
<item name="android:windowTitleStyle">@style/RtlOverlay.DialogWindowTitle.AppCompat</item>
<item name="android:windowTitleBackgroundStyle">@style/Base.DialogWindowTitleBackground.AppCompat</item>
<item name="android:windowBackground">@drawable/abc_dialog_material_background</item>
<item name="android:windowIsFloating">true</item>
<item name="android:backgroundDimEnabled">true</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowAnimationStyle">@style/Animation.AppCompat.Dialog</item>
<item name="android:windowSoftInputMode">stateUnspecified|adjustPan</item>
アプリ共通のテーマを継承しつつ、これらの設定をテーマに設定することで、統一感のあるダイアログを実装することができます。
まとめ
今回はActivity
をダイアログぽく表示する方法について紹介しました。DialogFragment
は実装に少しクセがあるコンポーネントなので、単に表示するだけなら今回の設定で簡単に実装することができます。ただ、ここまで書いてていまさらだが、Activity
をダイアログとして表示するのはAndroidのお作法的に正直あまりオススメしません。用法用量を守って計画的に。