Lollipop 导航栏与 Gravity.Bottom 重叠对话框

Posted

技术标签:

【中文标题】Lollipop 导航栏与 Gravity.Bottom 重叠对话框【英文标题】:Lollipop navigation bar overlapping Dialog with Gravity.Bottom 【发布时间】:2018-08-07 19:19:04 【问题描述】:

我正在遵循here 概述的技术,以便让我的 Dialog 浮动到屏幕底部并占据整个宽度,类似于抽屉。这适用于我所针对的所有 android 版本(16 岁以上),除了 Lollipop。对话框将浮动在软件导航按钮(返回、主页和堆栈)后面,因此无法按对话框上的负数或正数按钮。

我已经尝试过here 列出的方法,但没有成功。我已经考虑为我的所有对话框添加底部填充 - 但这意味着我必须设置自定义视图,而不是使用 alertdialog 构建器的其他方法。我认为可能有一种方法可以避免这种情况,但我没有找到。

编辑 1:

我现在尝试了 setSystemUiVisibility 方法,通过禁用全屏、沉浸式和隐藏导航的标志。但是,对话框在创建时仍然位于屏幕上的导航按钮后面(在 API 22 中测试)。我也试过了

decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);

这是我当前的代码:

@Override
public void onStart()

    super.onStart();

    AlertDialog dlg = (AlertDialog) getDialog();

    Window window = dlg.getWindow();
    WindowManager.LayoutParams params = window.getAttributes();
    params.width = ViewGroup.LayoutParams.MATCH_PARENT;
    params.height = ViewGroup.LayoutParams.WRAP_CONTENT;
    params.gravity = Gravity.BOTTOM;

    window.setAttributes(params);
    View decor = window.getDecorView();
    int flagset = View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION;
    decor.setSystemUiVisibility(decor.getSystemUiVisibility() & ~flagset);


@Override
public Dialog onCreateDialog(Bundle savedInstanceState)

    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), R.style.Theme_DialogTheme);
    //various methods adding elements to dialog

    Dialog dlg = builder.create();

    return dlg;


和我的风格:

<style name="Theme.SnapTrash" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:statusBarColor">@android:color/black</item>
    <item name="colorPrimary">@color/colorSnapTrashPrimary</item>
    <item name="android:colorBackground">@color/colorSnapTrashPrimary</item>
    <item name="android:textColorPrimary">@color/colorSnapTrashTextPrimary</item>
    <item name="android:windowBackground">?android:attr/colorBackground</item>
    <item name="colorAccent">@color/colorSnapTrashAccent</item>
    <item name="colorPrimaryDark">@color/colorSnapTrashPrimaryDark</item>
    <item name="android:colorForeground">@android:color/black</item>
    <item name="android:textColorPrimaryInverse">@color/colorSnapTrashTextPrimaryInverse</item>
    <item name="android:navigationBarColor">@android:color/black</item>
    <item name="android:textColorSecondaryInverse">@color/secondary_text_material_dark</item>
    <item name="android:windowDrawsSystemBarBackgrounds">false</item>
    <item name="android:windowTranslucentNavigation">false</item>

</style>

<style name="Theme.DialogTheme" parent="Theme.AppCompat.Light.Dialog">
    <item name="android:windowBackground">@android:color/white</item>
    <item name="android:windowIsFloating">false</item>
    <item name="android:textColor">#FFEF5350</item>
    <item name="android:textColorPrimary">#FFEF5350</item>
    <item name="android:colorAccent">#999</item>
</style>

【问题讨论】:

【参考方案1】:

你的导航栏是半透明的吗?你的对话框在导航栏后面吗?如果是这样,你可以设置对话框的主题。例如,你可以设置对话框的窗口标志不是全屏,不是半透明。如果不起作用,你可以这样设置UI标志:setSystemUiVisibility(int arg)

【讨论】:

如何设置反向标志。在查看该功能时,我看到了将其设置为全屏和半透明的标志,但是我不知道如何让它做相反的事情。 这里有关于切换标志的信息***.com/questions/47334381/… 我编辑了我的代码以实现 setSystemUiVisibility 方法并更新了操作。但是,这并没有解决软件导航按钮后面的对话框问题。 在您的 onStart() 代码中添加:getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); getWindow().getDecorView().setSystemUiVisibility(0); 或 `getWindow().setFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN,WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); getWindow().getDecorView().setSystemUiVisibility(0);`你也可以设置状态栏的颜色,设置导航栏不透明 谢谢!就像你说的我需要在我的对话框的主题上设置 falsefalse (两者都需要使用)不仅仅是基础活动。无论我对 setSystemUiVisibility 进行任何更改,这似乎都有效

以上是关于Lollipop 导航栏与 Gravity.Bottom 重叠对话框的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 7 中让导航栏与状态栏重叠

导航栏与状态栏

iOS:向应用程序窗口添加导航栏与状态栏冲突

如何将导航栏与css对齐

让导航栏与iOS 7中的状态栏重叠

css 导航栏与框阴影