import
android.content.Context;
import
android.graphics.Color;
import
android.graphics.drawable.ColorDrawable;
import
android.view.View;
import
android.view.WindowManager;
import
androidx.annotation.NonNull;
import
androidx.annotation.Nullable;
public
class
BaseDialog
extends
Dialog {
private
float
widthRatio =
1f;
private
float
heightRatio =
1f;
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);
* 设置对话框宽度与屏幕宽度占比 0.0~1.0
*
@param
widthRatio
public
void
setWidthHeightRatio(
float
widthRatio,
float
heightRation) {
this
.widthRatio =
widthRatio;
this
.heightRatio =
heightRation;
@Override
protected
void
onStart() {
super
.onStart();
//
去除对话框内边距与背景透明
WindowManager.LayoutParams layoutParams =
getWindow().getAttributes();
float
width = getContext().getResources().getDisplayMetrics().widthPixels *
widthRatio;
float
height = getContext().getResources().getDisplayMetrics().heightPixels *
heightRatio;
layoutParams.width
= (
int
) width;
layoutParams.height
= (
int
) height;
getWindow().setAttributes(layoutParams);
getWindow().getDecorView().setBackground(
new
ColorDrawable(Color.TRANSPARENT));
getWindow().getDecorView().setPadding(
0,0,0,0
);
//
隐藏导航栏与状态栏
WindowManager.LayoutParams params =
getWindow().getAttributes();
params.systemUiVisibility
= View.SYSTEM_UI_FLAG_FULLSCREEN |
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
|
View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
|
View.SYSTEM_UI_FLAG_IMMERSIVE
|
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION;
getWindow().setAttributes(params);
<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)
横屏显示不全的问题解决
@Override
protected void onStart() {
super.onStart();
if (mIsHorizontal){
getBehavior().setState(BottomSheetBehavior.STATE_EXPANDED);
隐藏状态栏与导航栏
@Override
protected void onStart() {
super.onStart();
//略...
//隐藏导航栏
WindowManager.LayoutParams params = getWindow().getAttributes();
params.systemUiVisibility = View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
| View.SYSTEM_UI_FLAG_IMMERSIVE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION;
getWindow().setAttributes(params);
本文来自博客园,作者:观心静 ,转载请注明原文链接:https://www.cnblogs.com/guanxinjing/p/14154232.html
本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。