系统自带的dialog并不能满足所有的项目需求,这时想要独一无二的弹窗就需要自定义自己的样式了。
1.创建类继承自dialog;
abstract class CustomDialog extends Dialog {
private Button sure,cancel;
private int layout;//需要加载的布局
private boolean TouchOutside;//是否可以点击弹窗之外的区域关闭弹窗
private double width, height;//弹窗的宽高
public CustomDialog(@NonNull Context context,int layout,boolean TouchOutside,double width ,double height) {
super(context,layout);
this.layout = layout;
this.TouchOutside = TouchOutside;
this.width = width;
this.height = height;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
requestWindowFeature(Window.FEATURE_NO_TITLE);
//去除局部背景
Window window = getWindow();
window.setBackgroundDrawableResource(R.color.transparent);//透明背景
View decorView = window.getDecorView(); //隐藏虚拟按键全屏显示,此段为项目需要,大家可以删除
decorView.setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
setContentView(layout);
sure = findViewById(R.id.sure);
cancel = findViewById(R.id.cancel);
//设置dialog大小
WindowManager manager = getWindowManager();
Display display = manager.getDefaultDisplay();
WindowManager.LayoutParams params = getWindow().getAttributes();
params.dimAmount = 0.42f;//设置背景有蒙版灰一点
params.width = (int) (display.getWidth() * width);//设置长
params.height = (int) (display.getHeight() * height);//设置宽
getWindow().setAttributes(params);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);//此处为必须,否则蒙版不生效
setCanceledOnTouchOutside(TouchOutside);//点击外部消失
sure.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
do_sure();
}
});
cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
dismiss();
}
});
}
public abstract void do_sure();
}
其中params.dimAmount = 0.42f;是为了设置背景有蒙版,灰一点,突出弹窗;必须加上getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);否则不会生效;
定义为抽象类的原因是:在需要创建的地方可以直接实现确定按钮的点击事件,这个类可以实现多种不同的布局,实现另一个弹窗不用再编写新的类;(但是要是你另一个弹窗没有确定按钮与取消按钮,那就当我没说)
2.创建dialog的布局;
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#FFFFFF">
<TextView
android:id="@+id/textview1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="提示"
android:textColor="@color/red"
android:textSize="36sp"
android:textStyle="bold"
android:layout_marginLeft="16dp"
android:layout_marginTop="16dp"/>
<TextView
android:layout_below="@id/textview1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="16dp"
android:layout_marginTop="16dp"
android:text="确认交班?"
android:textSize="26sp"
android:textColor="@color/text_color_smallblack"/>
<Button
android:id="@+id/sure"
android:layout_width="120dp"
android:layout_height="66dp"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:layout_marginRight="16dp"
android:layout_marginBottom="16dp"
android:background="@drawable/button_bg_blue2"
android:text="确定"
android:textSize="26sp"
android:textColor="#FFFFFF"/>
<Button
android:id="@+id/cancel"
android:layout_width="120dp"
android:layout_height="66dp"
android:layout_alignParentBottom="true"
android:layout_toLeftOf="@id/sure"
android:layout_marginRight="16dp"
android:layout_marginBottom="16dp"
android:background="@drawable/button_bg_black"
android:text="取消"
android:textSize="26sp"
android:textColor="#FFFFFF"/>
</RelativeLayout>
3.在需要弹窗的地方创建该类即可;
CustomDialog dialog = new CustomDialog(this, R.layout.logout_dialog,true,0.45,0.33) {
@Override
public void do_sure() {
Intent intent = new Intent(FragmentActivity.this,secondActivity.class);
startActivity(intent);
}
};
dialog.show();
其中0.45的意思为:弹窗的宽度 = 屏幕宽度*0.45;
0.33的意思为:弹窗的高度 = 屏幕的高度 * 0.33;
do_sure方法为确定按钮的点击事件,本处点击后进行Activity跳转。