gpt4 book ai didi

android - 在状态栏下方显示 DialogFragment 内容

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:59:23 24 4
gpt4 key购买 nike

我试图显示一个 DialogFragment 与 match_parent 的高度和宽度,但碰巧在顶部 DialogFragment 显示在 StatusBar 下方。

DialogFragment 正在为底部、右侧、左侧和顶部的填充应用一些默认值。但是顶部填充应该从 statusBar 开始计算,而不是从总屏幕尺寸开始。

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

最佳答案

默认情况下 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 is the flag, that you do not want to be applied. From docs:

Window flag: a special option only for use in combination with FLAG_LAYOUT_IN_SCREEN. When requesting layout in the screen your window may appear on top of or behind screen decorations such as the status bar. By also including this flag, the window manager will report the inset rectangle needed to ensure your content is not covered by screen decorations. This flag is normally set for you by Window as described in setFlags(int, int).

By default, windowIsFloating is enabled. So, if you declare your custom theme:

<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;
}

Where the layout content is following:

<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中看到那个标志的含义回答。

关于android - 在状态栏下方显示 DialogFragment 内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46467776/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com