Bug*_*0id 9 android android-dialog android-windowmanager android-dialogfragment android-window
我试图显示一个带有match_parent的DialogFragment高度和宽度,但它发生在顶部,DialogFragment显示在StatusBar下面.
DialogFragment在底部,右侧,左侧和顶部应用了一些默认值.但顶部填充应从statusBar开始计数,而不是从总屏幕大小开始计算.
如何将DialogFragment设置为match_parent,但是在顶部,底部,右侧,左侧具有正常/默认填充?
azi*_*ian 15
默认情况下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是标志,那你就不会想被应用.来自docs:
窗口标志:仅与FLAG_LAYOUT_IN_SCREEN结合使用的特殊选项.在屏幕中请求布局时,您的窗口可能会显示在屏幕装饰的顶部或后面,例如状态栏.通过包含此标志,窗口管理器将报告所需的插入矩形,以确保屏幕装饰不覆盖您的内容.这个标志通常由Window设置,如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>
Run Code Online (Sandbox Code Playgroud)
然后在你的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>
Run Code Online (Sandbox Code Playgroud)
然后你会得到这个输出:

如果您希望将粉红色布局布置在状态栏和导航栏上方,则只需应用于android:fitsSystemWindows="true"您的根ViewGroup:
<FrameLayout
...
android:fitsSystemWindows="true">
<View .../>
</FrameLayout>
Run Code Online (Sandbox Code Playgroud)
这将是输出:

你可以看到我的那面旗帜的意义这个答案.
| 归档时间: |
|
| 查看次数: |
4908 次 |
| 最近记录: |