在状态栏下方显示DialogFragment内容

时间:2017-09-28 11:15:38

标签: android android-dialogfragment android-dialog android-windowmanager android-window

我试图显示一个带有match_parent的DialogFragment,包括高度和宽度,但是它发生在顶部,DialogFragment显示在StatusBar下面。

DialogFragment在底部,右侧,左侧和顶部应用了一些默认值。但顶部填充应从statusBar开始计数,而不是从总屏幕大小开始计算。

如何将DialogFragment设置为match_parent,但是在顶部,底部,右侧,左侧有正常/默认填充?

1 个答案:

答案 0 :(得分:13)

默认情况下,Dialog会应用FLAG_LAYOUT_IN_SCREENFLAG_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是标志,您想要应用。来自docs

  

窗口标记:仅与 FLAG_LAYOUT_IN_SCREEN 组合使用的特殊选项。在屏幕中请求布局时,您的窗口可能会显示在屏幕装饰的顶部或后面,例如状态栏。通过包含此标志,窗口管理器将报告所需的插入矩形,以确保屏幕装饰不覆盖您的内容。此标志通常由窗口为您设置,如 setFlags(int,int)中所述。

默认情况下,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>

然后你会得到这个输出:

如果您希望将粉红色布局布置在状态栏和导航栏上方,则只需将android:fitsSystemWindows="true"应用于根ViewGroup

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

    <View .../>

</FrameLayout>

这将是输出:

您可以在this答案中看到该标志的含义。