高さと幅の両方についてmatch_parentを使用してDialogFragmentを表示しようとしていますが、上部にDialogFragmentがStatusBarの下に表示されていることがあります。
DialogFragmentは、下、右、左、および上のパディングにデフォルト値を適用しています。ただし、上部のパディングは、画面の合計サイズからではなく、statusBarからカウントを開始する必要があります。
DialogFragmentをmatch_parentに設定し、上、下、右、左に通常/デフォルトのパディングを設定するにはどうすればよいですか?
デフォルトでは、Dialog
が適用されます FLAG_LAYOUT_IN_SCREEN
および FLAG_LAYOUT_INSET_DECOR
フラグ。 PhoneWindow
からの抜粋:
mIsFloating = a.getBoolean(R.styleable.Window_windowIsFloating, false);
int flagsToUpdate = (FLAG_LAYOUT_IN_SCREEN|FLAG_LAYOUT_INSET_DECOR)
& (~getForcedWindowFlags());
if (mIsFloating) {
setLayout(WRAP_CONTENT, WRAP_CONTENT);
setFlags(0, flagsToUpdate);
} else {
setFlags(FLAG_LAYOUT_IN_SCREEN|FLAG_LAYOUT_INSET_DECOR, flagsToUpdate);
}
FLAG_LAYOUT_INSET_DECOR
は、あなたが行うフラグですnot適用したいです。から docs :
ウィンドウフラグ:FLAG_LAYOUT_IN_SCREENと組み合わせてのみ使用するための特別なオプション。画面のレイアウトをリクエストすると、ステータスバーなどの画面装飾の上または後ろにウィンドウが表示される場合があります。このフラグも含めることにより、ウィンドウマネージャーは、コンテンツが画面装飾で覆われないようにするために必要なはめ込み長方形を報告します。このフラグは通常、setFlags(int、int)で説明されているように、Windowによって設定されます。
デフォルトでは、windowIsFloating
が有効になっています。したがって、カスタムテーマを宣言する場合:
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
...
<item name="Android:windowTranslucentStatus">true</item>
<item name="Android:windowTranslucentNavigation">true</item>
<item name="Android:windowDrawsSystemBarBackgrounds">true</item>
</style>
<style name="MyTheme" parent="@style/ThemeOverlay.AppCompat.Dialog.Alert">
<item name="Android:windowBackground">@Android:color/transparent</item>
<item name="Android:colorBackgroundCacheHint">@null</item>
<item name="Android:windowFrame">@null</item>
<item name="Android:windowContentOverlay">@null</item>
<item name="Android:windowAnimationStyle">@null</item>
<item name="Android:windowIsFloating">false</item>
<item name="Android:backgroundDimEnabled">false</item>
<item name="Android:windowIsTranslucent">true</item>
<item name="Android:windowNoTitle">true</item>
</style>
次に、DialogFragment
で:
public Dialog onCreateDialog(Bundle savedInstanceState) {
Dialog dialog = new Dialog(getActivity(), R.style.MyTheme);
dialog.setContentView(R.layout.your_layout);
return dialog;
}
レイアウトの内容は次のとおりです。
<FrameLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:orientation="vertical">
<View
Android:layout_gravity="center_horizontal"
Android:background="@color/colorAccent"
Android:layout_width="250dp"
Android:layout_height="700dp"/>
</FrameLayout>
次に、次の出力が得られます。
ピンクのレイアウトをステータスバーの下とナビゲーションバーの上に配置する場合は、ルートViewGroup
にAndroid:fitsSystemWindows="true"
を適用するだけです。
<FrameLayout
...
Android:fitsSystemWindows="true">
<View .../>
</FrameLayout>
これが出力になります:
そのフラグの意味は私の this answerで見ることができます。