web-dev-qa-db-ja.com

ステータスバーの下にDialogFragmentのコンテンツを表示する

高さと幅の両方についてmatch_parentを使用してDialogFragmentを表示しようとしていますが、上部にDialogFragmentがStatusBarの下に表示されていることがあります。

DialogFragmentは、下、右、左、および上のパディングにデフォルト値を適用しています。ただし、上部のパディングは、画面の合計サイズからではなく、statusBarからカウントを開始する必要があります。

DialogFragmentをmatch_parentに設定し、上、下、右、左に通常/デフォルトのパディングを設定するにはどうすればよいですか?

10
Bugdr0id

デフォルトでは、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>

次に、次の出力が得られます。


ピンクのレイアウトをステータスバーの下とナビゲーションバーの上に配置する場合は、ルートViewGroupAndroid:fitsSystemWindows="true"を適用するだけです。

<FrameLayout
    ...
    Android:fitsSystemWindows="true">

    <View .../>

</FrameLayout>

これが出力になります:

そのフラグの意味は私の this answerで見ることができます。

16
azizbekian