棒棒糖导航栏与 Gravity.Bottom 重叠的对话框
Lollipop navigation bar overlapping Dialog with Gravity.Bottom
我正在遵循 here 概述的技术,以便让我的对话框浮动到屏幕底部并占据整个宽度,类似于抽屉。这适用于我定位的 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>
你的导航栏是半透明的吗?你的对话框在导航栏后面吗?如果是这样,你可以设置对话框的theme.For例子,你可以设置对话框的window标志不是全屏,不是translucent.If它不起作用,你设置UI flag这样的方法:setSystemUiVisibility(int arg)
我正在遵循 here 概述的技术,以便让我的对话框浮动到屏幕底部并占据整个宽度,类似于抽屉。这适用于我定位的 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>
你的导航栏是半透明的吗?你的对话框在导航栏后面吗?如果是这样,你可以设置对话框的theme.For例子,你可以设置对话框的window标志不是全屏,不是translucent.If它不起作用,你设置UI flag这样的方法:setSystemUiVisibility(int arg)