Dialog的使用可以简单分为:1.使用原生方法(多为AlertDialog.Builder所提供)。2.自定义Dialog。

Screenshot_2019-06-16-23-19-27_副本.png

Screenshot_2019-06-16-23-19-27_副本2.png

Screenshot_2019-06-16-23-19-27_副本3.png
需要注意的是,Dialog是自带背景的,根据不同的Theme可以有不同颜色的背景,如上图,在使用有背景的View时,白色的四个角显得很难看,可以根据需求设置。
<!--明亮风格的Dialog-->
<style name="LightDialog" parent="Base.Theme.AppCompat.Light.Dialog">
</style>
<!--暗风格的Dialog-->
<style name="Dialog" parent="Base.Theme.AppCompat.Dialog">
</style>
<!--没有背景的Dialog-->
<style name="NoBackgroundDialog" parent="Base.Theme.AppCompat.Light.Dialog">
<!--解决布局无法占据全屏的问题,是window的背景,比background高一级-->
<item name="android:windowBackground">@null</item>
<!--布局的背景-->
<item name="android:background">@null</item>
<!--window的前景-->
<item name="android:windowFrame">@null</item>
<!--昏暗效果启用:false,则dialog的背景没有半透明效果-->
<item name="android:backgroundDimEnabled">true</item>
<!--window是否半透明:好像没有什么效果-->
<item name="android:windowIsTranslucent">true</item>
<!--悬浮于activity之上-->
<item name="android:windowIsFloating">true</item>
</style>
1.普通Dialog
private void bt1Click() {
new AlertDialog.Builder(this, R.style.LightDialog)
.setTitle("普通Dialog")
.setMessage("消息内容")
.setNeutralButton("关闭", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
L.e("Dialog%d", which);
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
L.e("Dialog%d", which);
}
})
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
L.e("Dialog%d", which);
}
}).show();
}
2.多选框
private void bt2Click() {
new AlertDialog.Builder(this, R.style.LightDialog)
.setTitle("多选框")
.setMultiChoiceItems(R.array.items, null, new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
L.e("第%d个选择%b", which, isChecked);
}
}).show();
}
3.单选框
private void bt3Click() {
AlertDialog.Builder builder = new AlertDialog.Builder(this, R.style.LightDialog);
builder.setTitle("单选框");
//方法1
builder.setSingleChoiceItems(R.array.items, 1, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
L.e(which);
}
});
//方法2:类似于列表
builder.setSingleChoiceItems(
new ArrayAdapter<>(this, R.layout.item_dialog, R.id.tv_item_dialog, new String[]{"a", "b", "c"}),
1,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
L.e(which);
}
});
builder.show();
}
4.列表框
private void bt4Click() {
AlertDialog.Builder builder = new AlertDialog.Builder(this, R.style.LightDialog);
builder.setTitle("列表框");
//方法1
/* builder.setItems(R.array.items, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
L.e(which);
}
});*/
//方法2
builder.setAdapter(
new ArrayAdapter<>(this, R.layout.item_dialog, R.id.tv_item_dialog, new String[]{"a", "b", "c"}),
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
L.e(which);
}
});
builder.show();
}
5.等待框
private void bt5Click() {
ProgressDialog progressDialog = new ProgressDialog(this);
progressDialog.setTitle("等待框");
progressDialog.setMessage("等待中");
progressDialog.show();
}
6.进度框
private void bt6Click() {
ProgressDialog progressDialog = new ProgressDialog(this);
progressDialog.setTitle("进度条");
progressDialog.setMessage("等待中");
progressDialog.setIndeterminate(false);
progressDialog.setMax(100);
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.show();
progressDialog.setProgress(60);
}
7.自定义View框
private void bt7Click() {
AlertDialog.Builder builder = new AlertDialog.Builder(this, R.style.LightDialog);
builder.setTitle("自定义View Dialog");
AlertDialog alertDialog = null;
View view = LayoutInflater.from(this).inflate(R.layout.view_dialog, null);
builder.setView(view);
alertDialog = builder.show();
final AlertDialog finalAlertDialog = alertDialog;
view.findViewById(R.id.tv_determine)
.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finalAlertDialog.dismiss();
}
});
view.findViewById(R.id.tv_cancel)
.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finalAlertDialog.dismiss();
}
});
}
8.自定义Dialog
private void bt8Click() {
CustomizeDialog customizeDialog = new CustomizeDialog(this);
customizeDialog.setOnButtonClickListener(new CustomizeDialog.OnButtonClickListener() {
@Override
public void onCancelClick(Dialog dialog) {
dialog.dismiss();
Toast.makeText(MainActivity.this, "取消", Toast.LENGTH_SHORT).show();
}
@Override
public void onDetermineClick(Dialog dialog) {
dialog.dismiss();
Toast.makeText(MainActivity.this, "确定", Toast.LENGTH_SHORT).show();
}
});
customizeDialog.show();
}
9.封装DialogUtils
private void bt9Click() {
View view = LayoutInflater.from(this).inflate(R.layout.view_dialog, null);
final Dialog dialog = new DialogUtils()
.with(this, R.style.NoBackgroundDialog)
.contentView(view)
.gravity(Gravity.BOTTOM)
.width((int) (getResources().getDisplayMetrics().widthPixels * 0.9))
.show();
TextView tvCancel = view.findViewById(R.id.tv_cancel);
TextView tvDetermine = view.findViewById(R.id.tv_determine);
tvCancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
}
});
tvDetermine.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
}
});
}
DialogUtils:对于需要自定义View的Dialog,一些常用的操作可以简单封装起来
import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.support.annotation.LayoutRes;
import android.view.View;
public class DialogUtils {
private Params p;
public DialogUtils() {
p = new Params();
}
public DialogUtils with(Activity context, int theme) {
p.context = context;
p.mTheme = theme;
return this;
}
public DialogUtils contentView(@LayoutRes int layoutResId) {
p.mLayoutResId = layoutResId;
return this;
}
public DialogUtils contentView(View view) {
p.mContentView = view;
return this;
}
public DialogUtils gravity(int gravity) {
p.mGravity = gravity;
return this;
}
public DialogUtils width(int widthPixels) {
p.mWidth = widthPixels;
return this;
}
public DialogUtils cancelable(boolean cancelable) {
p.mCancelable = cancelable;
return this;
}
public DialogUtils canceledOnTouchOutside(boolean canceledOnTouchOutside) {
p.mCanceledOnTouchOutside = canceledOnTouchOutside;
return this;
}
public Dialog create() {
return apply(p);
}
public Dialog show() {
Dialog dialog = this.create();
dialog.show();
return dialog;
}
private Dialog apply(Params p) {
Dialog dialog = new Dialog(p.context, p.mTheme);
if (p.mLayoutResId == 0 && p.mContentView != null) {
dialog.setContentView(p.mContentView);
}
if (p.mLayoutResId != 0 && p.mContentView == null) {
dialog.setContentView(p.mLayoutResId);
}
if (p.mLayoutResId != 0 && p.mContentView != null) {
dialog.setContentView(p.mContentView);
}
if (p.mWidth != -1) {
dialog.getWindow().getAttributes().width = p.mWidth;
}
if (p.mGravity != -1) {
dialog.getWindow().getAttributes().gravity = p.mGravity;
}
dialog.setCancelable(p.mCancelable);
dialog.setCanceledOnTouchOutside(p.mCanceledOnTouchOutside);
return dialog;
}
public class Params {
Context context;
int mTheme;
int mLayoutResId;
View mContentView;//优先使用contentView
int mGravity = -1;
int mWidth = -1;
boolean mCancelable = true;
boolean mCanceledOnTouchOutside = true;
}
}