本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点
在 Android 开发中,当你使用 Dialog 或 DialogFragment 时,可以通过设置 Window
的背景变暗来突出它的可见性。这个效果是通过 backgroundDimAmount
属性来控制的。
那我们怎么动态设置backgroundDimAmount
呢?
DialogFragment
假设你正在使用 DialogFragment
,那么你可以在 onCreateDialog
或 onViewCreated
方法中配置 Dialog
的窗口属性。
在 DialogFragment
中设置 backgroundDimAmount
public class MyDialogFragment extends DialogFragment {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Dialog dialog = super.onCreateDialog(savedInstanceState);
Window window = dialog.getWindow();
if (window != null) {
WindowManager.LayoutParams layoutParams = window.getAttributes();
layoutParams.dimAmount = 0.5f; // 设置dimAmount为0.5,即背景变得半透明
window.setAttributes(layoutParams);
window.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
}
return dialog;
}
// 如果你的DialogFragment使用的是布局文件,需要在onViewCreated中调用上面的代码
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
Window window = getDialog().getWindow();
if (window != null) {
WindowManager.LayoutParams layoutParams = window.getAttributes();
layoutParams.dimAmount = 0.5f; // 设置dimAmount为0.5,即背景变得半透明
window.setAttributes(layoutParams);
window.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
}
}
}
动态调整 dimAmount
如果你需要在应用运行时根据某些条件动态调整 dimAmount
,可以通过保存 WindowManager.LayoutParams
并在需要时更新它:
public class MyDialogFragment extends DialogFragment {
private WindowManager.LayoutParams layoutParams;
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Dialog dialog = super.onCreateDialog(savedInstanceState);
Window window = dialog.getWindow();
if (window != null) {
layoutParams = window.getAttributes();
layoutParams.dimAmount = 0.5f; // 初始设置
window.setAttributes(layoutParams);
window.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
}
return dialog;
}
public void updateDimAmount(float dimAmount) {
if (layoutParams != null) {
layoutParams.dimAmount = dimAmount;
if (getDialog() != null && getDialog().getWindow() != null) {
getDialog().getWindow().setAttributes(layoutParams);
}
}
}
}
然后你可以通过调用 updateDimAmount
来动态调整 dimAmount
:
MyDialogFragment dialogFragment = new MyDialogFragment();
dialogFragment.show(getSupportFragmentManager(), "MyDialog");
// 动态调整dimAmount
dialogFragment.updateDimAmount(0.8f); // 将dimAmount调整为0.8
这样你就可以在不同情况下动态调整 Dialog 的 backgroundDimAmount
了。
Dialog
在 Dialog
中设置 backgroundDimAmount
如果你直接使用 Dialog
而不是 DialogFragment
,你可以在创建 Dialog
时设置 dimAmount
:
Dialog dialog = new Dialog(context);
dialog.setContentView(R.layout.dialog_layout);
Window window = dialog.getWindow();
if (window != null) {
WindowManager.LayoutParams layoutParams = window.getAttributes();
layoutParams.dimAmount = 0.5f; // 设置dimAmount为0.5,即背景变得半透明
window.setAttributes(layoutParams);
window.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
}
dialog.show();
静态的方式
静态的方式也就是创建Dialog时直接设置主题theme
<style name="MyDialogTheme" parent="@style/Theme.Design.BottomSheetDialog" >
<item name="android:windowIsFloating">false</item>
<item name="android:backgroundDimAmount">0.5</item>
<item name="android:backgroundDimEnabled">true</item>
<item name="android:windowFullscreen">true</item>
<item name="android:windowContentOverlay">@null</item>
</style>
需要注意的是,这个backgroundDimAmount
的数值🈷️接近1,则背景越黑,如果是1的话就是完全看不到背景
欢迎关注我的公众号AntDream查看更多精彩文章!