删除 AlertDialog 的昏暗持续时间
Remove dim duration of AlertDialog
可以通过以下方式禁用 AlertDialog
的暗淡效果:
alertDialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
此外,可以使用以下方法更改暗淡量:
alertDialog.getWindow().setDimAmount(0.0f);
但是,每当我调用这些函数时,变化似乎会持续很短的时间(100-200 之间的长值)。有没有办法立即进行更改?
当尝试用模拟视图替换标准暗淡时,屏幕似乎由于暗淡变化的动画而闪烁。
编辑: 这是基本应用程序主题:
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
AlertDialog 是从 AlertDialog.Builder 创建的(稍后添加了点击侦听器):
dialogBuilder=new AlertDialog.Builder(this);
dialogBuilder.setTitle("Title").setIcon(null).setMessage("Description")
.setNeutralButton("Neutral",null).setNegativeButton("Cancel",null).setPositiveButton("Ok",null);
alertDialog=dialogBuilder.create();
将此添加到您的主题中:
<item name="android:backgroundDimEnabled">false</item>
并从代码上严格控制主题
如果不想通过主主题来控制对话框的主题
仅为对话框创建子类并按以下方式使用它
<style name="DialogTheme" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge">
<item name="android:backgroundDimEnabled">false</item>
</style>
dialogBuilder = new AlertDialog.Builder(this, R.style.DialogTheme);
如果您希望所有对话框都禁用暗淡,那么您可以这样做:
转到 styles.xml,然后在您的主主题中添加:
<item name="alertDialogTheme">@style/MyAlertDialogTheme</item>
然后在下面添加另一个主题(我们在上面引用的那个)
<style name="MyAlertDialogTheme" parent="Theme.AppCompat.Light.Dialog.Alert">
<item name="android:backgroundDimEnabled">false</item>
</style>
此外,如果您想要非常低的暗淡度,可以将其更改为:
<item name="android:backgroundDimAmount">0.05</item>
正如此处其他答案所建议的那样,我认为最好完全禁用暗淡效果。我不想覆盖所有的 AlertDialogs,所以它似乎只使用背景 View
并用 AlertDialog
的 setOnShowListener
淡化它 in/out 就足够了和 setOnDismissListener
.
alertDialog=dialogBuilder.create();
alertDialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
alertDialog.setOnShowListener(new DialogInterface.OnShowListener(){
@Override public void onShow(DialogInterface dialog) {
background.setAlpha(0f);background.setVisibility(View.VISIBLE);background.animate().alpha(1f).setDuration(dur);
}
});
alertDialog.setOnDismissListener(new DialogInterface.OnDismissListener(){
@Override public void onDismiss(DialogInterface dialog){
background.animate().alpha(0f).withEndAction(runnable_background_gone);
}
});
可以通过以下方式禁用 AlertDialog
的暗淡效果:
alertDialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
此外,可以使用以下方法更改暗淡量:
alertDialog.getWindow().setDimAmount(0.0f);
但是,每当我调用这些函数时,变化似乎会持续很短的时间(100-200 之间的长值)。有没有办法立即进行更改?
当尝试用模拟视图替换标准暗淡时,屏幕似乎由于暗淡变化的动画而闪烁。
编辑: 这是基本应用程序主题:
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
AlertDialog 是从 AlertDialog.Builder 创建的(稍后添加了点击侦听器):
dialogBuilder=new AlertDialog.Builder(this);
dialogBuilder.setTitle("Title").setIcon(null).setMessage("Description")
.setNeutralButton("Neutral",null).setNegativeButton("Cancel",null).setPositiveButton("Ok",null);
alertDialog=dialogBuilder.create();
将此添加到您的主题中:
<item name="android:backgroundDimEnabled">false</item>
并从代码上严格控制主题
如果不想通过主主题来控制对话框的主题 仅为对话框创建子类并按以下方式使用它
<style name="DialogTheme" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge">
<item name="android:backgroundDimEnabled">false</item>
</style>
dialogBuilder = new AlertDialog.Builder(this, R.style.DialogTheme);
如果您希望所有对话框都禁用暗淡,那么您可以这样做: 转到 styles.xml,然后在您的主主题中添加:
<item name="alertDialogTheme">@style/MyAlertDialogTheme</item>
然后在下面添加另一个主题(我们在上面引用的那个)
<style name="MyAlertDialogTheme" parent="Theme.AppCompat.Light.Dialog.Alert">
<item name="android:backgroundDimEnabled">false</item>
</style>
此外,如果您想要非常低的暗淡度,可以将其更改为:
<item name="android:backgroundDimAmount">0.05</item>
正如此处其他答案所建议的那样,我认为最好完全禁用暗淡效果。我不想覆盖所有的 AlertDialogs,所以它似乎只使用背景 View
并用 AlertDialog
的 setOnShowListener
淡化它 in/out 就足够了和 setOnDismissListener
.
alertDialog=dialogBuilder.create();
alertDialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
alertDialog.setOnShowListener(new DialogInterface.OnShowListener(){
@Override public void onShow(DialogInterface dialog) {
background.setAlpha(0f);background.setVisibility(View.VISIBLE);background.animate().alpha(1f).setDuration(dur);
}
});
alertDialog.setOnDismissListener(new DialogInterface.OnDismissListener(){
@Override public void onDismiss(DialogInterface dialog){
background.animate().alpha(0f).withEndAction(runnable_background_gone);
}
});