记录一些自己项目上自定义的Dialog
基础Dialog
public class BaseDialog extends Dialog { private float widthRatio = 1f; private ShapeDrawable mShapeDrawable; public BaseDialog(@NonNull Context context) { super(context); } public BaseDialog(@NonNull Context context, int themeResId) { super(context, themeResId); } protected BaseDialog(@NonNull Context context, boolean cancelable, @Nullable OnCancelListener cancelListener) { super(context, cancelable, cancelListener); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } /** * 设置对话框宽度与屏幕宽度占比 0.0~1.0 * * @param widthRatio */ public void setWidthRatio(float widthRatio) { this.widthRatio = widthRatio; } @Override protected void onStart() { super.onStart(); WindowManager.LayoutParams layoutParams = getWindow().getAttributes(); float width = getContext().getResources().getDisplayMetrics().widthPixels * widthRatio; layoutParams.width = (int) width; getWindow().setAttributes(layoutParams); getWindow().getDecorView().setBackground(new ColorDrawable(Color.TRANSPARENT)); } }
实现对话框全透明
在styles添加
<style name="dialogTransparent" parent="@android:style/Theme.Dialog"> <item name="android:windowFrame">@null</item> <!--边框--> <item name="android:windowIsFloating">true</item> <!--是否浮现在activity之上--> <item name="android:windowIsTranslucent">true</item> <!--半透明--> <item name="android:windowNoTitle">true</item> <!--无标题--> <item name="android:background">@android:color/transparent</item> <!--背景透明--> <item name="android:windowBackground">@android:color/transparent</item> <!--背景透明--> <item name="android:backgroundDimEnabled">true</item> <!--模糊--> <item name="android:backgroundDimAmount">0.5</item> <!--背景透明度0到1 50%就是0.5--> </style>
将风格添加
public class NumberInputDialog extends BottomSheetDialog implements View.OnClickListener { public NumberInputDialog(@NonNull Context context) { super(context,R.style.dialogTransparent); initView(); } //略...
设置背景透明
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().getDecorView().setBackground(new ColorDrawable(Color.TRANSPARENT)); }
设置全屏
请注意,在开发的时候经常会发现,我们设置的全屏的宽度或者全屏的高度后经常外面还要一些边缘空白空间,需要设置setPadding来取消空白内边距,代码如下:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().getDecorView().setPadding(0,0,0,0);//取消内边距空白 getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);//设置全屏 }
或者
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().getDecorView().setPadding(0,0,0,0);//取消内边距空白 WindowManager.LayoutParams layoutParams = getWindow().getAttributes(); layoutParams.width = WindowManager.LayoutParams.MATCH_PARENT; layoutParams.height = WindowManager.LayoutParams.MATCH_PARENT; getWindow().setAttributes(layoutParams); }
在取消内边距空白后,还有一个好处,那就是设置 layoutParams.width 与layoutParams.height 会更加准确
设置对话框显示位置
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //设置显示位置 Gravity.BOTTOM Gravity.TOP Gravity.LEFT Gravity.RIGHT Gravity.CENTER getWindow().setGravity(Gravity.BOTTOM); }
弹出输入法并且焦点选中输入框
EditText editTextTextPersonName = findViewById(R.id.editTextTextPersonName); getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);//设置输入盘可见 editTextTextPersonName.requestFocus();
设置背景阴影透明度
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); WindowManager.LayoutParams layoutParams = getWindow().getAttributes(); layoutParams.dimAmount = 0f;//调整透明度 getWindow().setAttributes(layoutParams); }
BottomSheetDialog禁用下滑退出
private fun showDurationPickerDialog(){ val dialog = context?.let { BottomSheetDialog(it) } val binding = DialogDurationPickerBinding.inflate(layoutInflater) dialog?.setContentView(binding.root) binding.root.post { val view = dialog?.findViewById<View>(R.id.design_bottom_sheet) val behavior = view?.let { BottomSheetBehavior.from(it) } behavior?.isHideable = false } //略...
BottomSheetDialog背景透明(显示圆角)
BottomSheetDialog对话框其实是自带一个白色背景的,我们在自己的布局设置圆角shape后会出现不显示的情况.
val dialog = BottomSheetDialog(this) dialog.setContentView(R.layout.main_dialog_bottom_wheel) dialog.show() //设置背景透明,需要在show方法后面 dialog.findViewById<View>(R.id.design_bottom_sheet)?.setBackgroundResource(android.R.color.transparent)
end