public class BaseDialog extends Dialog{
private Context context;
private Window dialogWindow;
private WindowManager.LayoutParams dialogLayoutParams;
public BaseDialog(@NonNull Context context){
super(context);
this.context = context;
init();
}
public BaseDialog(@NonNull Context context, @StyleRes int themeResId) {
super(context, themeResId);
this.context = context;
init();
}
private void init(){
dialogWindow = this.getWindow();
dialogLayoutParams = dialogWindow.getAttributes();
setCanceledOnTouchOutside(true);//设置点击Dialog外部任意区域关闭Dialog
}
public void setGravity(int gravity){
dialogWindow.setGravity(gravity);
}
public Window getDialogWindow(){
return dialogWindow;
}
public WindowManager.LayoutParams getDialogLayoutParams(){
return dialogLayoutParams;
}
}
/**
* dialog工具类
*/
public class DialogUtils {
private Context context;
private BaseDialog baseDialog;
private WindowManager.LayoutParams layoutParams;
public DialogUtils(Context context){
this.context = context;
baseDialog = new BaseDialog(context, R.style.NoTitleDialog);
layoutParams = baseDialog.getDialogLayoutParams();
}
public DialogUtils setContentView(View view){
baseDialog.setContentView(view);
layoutParams = baseDialog.getDialogLayoutParams();
layoutParams.height = LinearLayout.LayoutParams.WRAP_CONTENT;
layoutParams.width = LinearLayout.LayoutParams.WRAP_CONTENT;
baseDialog.getDialogWindow().setAttributes(layoutParams);
return this;
}
public DialogUtils setContentViewSize(double width, double height){
if(width != 0){
layoutParams.width = (int) width;
}
if(height != 0){
layoutParams.height = (int) height;
}
baseDialog.getDialogWindow().setAttributes(layoutParams);
return this;
}
/**
* 为Dialog设置显示位置的时候为什么要先设置其显示位置为左上角呢?
* 因为diaolog的默认显示位置为屏幕的正中央(center),而我们并不知道其当前的XY,所以XY点还是
* 从屏幕的左上角开始计算比较好
*/
public DialogUtils setXY(int x, int y){
layoutParams.gravity = Gravity.LEFT | Gravity.TOP;
layoutParams.x = x;
layoutParams.y = y;
baseDialog.getDialogWindow().setAttributes(layoutParams);
return this;
}
public DialogUtils setGravity(int gravity){
baseDialog.setGravity(gravity);
return this;
}
public void show(){
baseDialog.show();
}
public BaseDialog getBaseDialog(){
return baseDialog;
}
}
调用实例
private View tipExitView;
private TextView tipExitCancelTv;
private TextView tipExitOkTv;
private DialogUtils dialogUtils;
@Override
public void onBackPressed() {
// super.onBackPressed();
tipExitView = View.inflate(this,R.layout.view_back_tip,null);
tipExitCancelTv = (TextView) tipExitView.findViewById(R.id.dialog_exitTip_cancel);
tipExitOkTv = (TextView) tipExitView.findViewById(R.id.dialog_exitTip_ok);
tipExitCancelTv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
dialogUtils.getBaseDialog().cancel();
}
});
tipExitOkTv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
System.exit(0);
}
});
dialogUtils = new DialogUtils(this);
dialogUtils.show();
dialogUtils.setContentView(tipExitView);
dialogUtils.setContentViewSize(BaseApplication.WINDOW_WIDTH * 0.8,0);
}
下面是两种常用Style,一种是透明,一种半透明
<!--无标题透明dialog-->
<style name="NoTitleTransparentDialog">
<item name="android:windowTitleStyle">@null</item>
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
</style>
<!--无标题不透明-->
<style name="NoTitleDialog">
<item name="android:windowTitleStyle">@null</item>
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowIsFloating">true</item>
</style>