Dialog
Dialog
AlertDialog
TimePickerDialog
DatePickerDialog
ProgressDialog
AppCompatDialog
AlertDialog
Presentation
CharacterPickerDialog
AlertDialog
AlertDialog.Builder builder = new Builder(当前Activity的上下文);
setTitle(String title) | 设置标题 |
---|---|
setMessage(String msg) | 设置提醒信息 |
setCancelable(boolean isCancleable) | true:点击非Dialog区域,Dialog消失 |
setPositiveButton(…) | 右边的按钮 |
setNegativeButton(…) | 左边的按钮 |
setNeutralButton(…) | 中间的按钮 |
setSingleChoiceItems(…) | 单选 |
setMultiChoiceItems(…) | 多选 |
show() | 显示 |
dismiss():消失方法必须由Dialog对象调用
Dialog dialog = builder.show();
dialog.dismiss();
ProgressDialog
//有耗时操作,必须在子线程中运行
ProgressDialog pd = new ProgressDialog(当前Activity的上下文);
setProgressStyle() | 进度条风格 |
---|---|
dismiss() | 消失 |
确定取消对话框
AlertDialog.Builder builder = new Builder(this);
builder.setTitle("标题");
builder.setMessage("提醒信息");
builder.setPositiveButton("确定", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {}
});
builder.setNegativeButton("取消", new OnClickListener() {
//点击事件如果设置为null则默认点击关闭对话框
@Override
public void onClick(DialogInterface dialog, int which) {}
});
builder.show();
单选对话框
AlertDialog.Builder builder = new Builder(this);
builder.setTitle("选择性别");
final String[] items = { "男", "女", "中性" }; //从上至下依次设置单选项的内容
//items显示的条目数组,第二个参数为默认选中的条目,-1即不选中任何条目
builder.setSingleChoiceItems(items, -1, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {}
});
builder.setNegativeButton("取消", null);
builder.show();
多选对话框
AlertDialog.Builder builder = new Builder(this);
builder.setTitle("选择水果");
final String[] items = new String[] { "西瓜", "桃子", "葡萄"};
//条目的状态数组 true为选中 false为不选中
final boolean[] checkedItems = new boolean[] {true, false, false, false};
builder.setMultiChoiceItems(items, checkedItems,
new OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog, int which,boolean isChecked) {}
});
builder.setNegativeButton("取消", null);
builder.show();
加载对话框
final ProgressDialog pd = new ProgressDialog(this);
pd.setTitle("标题");
pd.setMessage("加载中...");
pd.show();
new Thread() { //进度条是延时操作,必须放在子线程中运行
public void run() {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
pd.dismiss();
}
}.start();
进度条
final ProgressDialog pd = new ProgressDialog(this);
//设置进度条样式:
//STYLE_SPINNER 0
//STYLE_HORIZONTAL 1
pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pd.setMax(100); //设置进度条的最大值,默认100
pd.setTitle("标题");
pd.setMessage("加载中");
pd.show();
new Thread() {
public void run() {
for (int i = 0; i <= 100; i++) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
pd.setProgress(i); //设置当前进度值
}
pd.dismiss();
}
}.start();
自定义页面对话框
//初始化对话框
AlertDialog.Builder builder = new AlertDialog.Builder(this);
View view = View.inflate(上下文, R.layout.dialog_pwd, null);
builder.setView(view); //将自定义view添加到builder中
EditText dialog_pwd = (EditText) view.findViewById(R.id.et_dialog_pwd);
EditText dialog_confirm = (EditText)view.findViewById(R.id.et_dialog_pwd_confirm);
Button bt_sure = (Button) view.findViewById(R.id.bt_dialog_sure);
Button bt_cancel = (Button) view.findViewById(R.id.bt_dialog_cancel);
bt_sure.setOnClickListener(new View.OnClickListener() { //确定按钮
@Override
public void onClick(View view) {}
});
bt_cancel.setOnClickListener(new View.OnClickListener() { //取消按钮
@Override
public void onClick(View view) {
dialog.dismiss(); //取消对话框
}
});
builder.show();//显示对话框
自定义对话框
<!--对话框的样式-->
<style name="NormalDialogStyle">
<!--对话框背景 -->
<item name="android:windowBackground">@android:color/transparent</item>
<!--边框 -->
<item name="android:windowFrame">@null</item>
<!--没有标题 -->
<item name="android:windowNoTitle">true</item>
<!-- 是否浮现在Activity之上 -->
<item name="android:windowIsFloating">true</item>
<!--背景透明 -->
<item name="android:windowIsTranslucent">false</item>
<!-- 是否有覆盖 -->
<item name="android:windowContentOverlay">@null</item>
<!--进出的显示动画 -->
<item name="android:windowAnimationStyle">@style/normalDialogAnim</item>
<!--背景变暗-->
<item name="android:backgroundDimEnabled">true</item>
</style>
<!--对话框动画-->
<style name="normalDialogAnim" parent="android:Animation">
<item name="@android:windowEnterAnimation">@anim/normal_dialog_enter</item>
<item name="@android:windowExitAnimation">@anim/normal_dialog_exit</item>
</style>
TextView cancel = (TextView) view.findViewById(R.id.cancel);
TextView confirm = (TextView) view.findViewById(R.id.confirm);
final Dialog dialog = new Dialog(this, R.style.NormalDialogStyle);
View view = View.inflate(this, R.layout.dialog_normal, null);
//设置对话框的大小
view.setMinimumHeight((int) (ScreenSizeUtils.getInstance(this).getScreenHeight() * 0.23f));
dialog.setContentView(view);
//设置在点击对话框外部后,对话框是否消失
dialog.setCanceledOnTouchOutside(true);
Window dialogWindow = dialog.getWindow();
WindowManager.LayoutParams lp = dialogWindow.getAttributes();
//自定义对话框宽度为屏幕的75%
lp.width = (int) (ScreenSizeUtils.getInstance(this).getScreenWidth() * 0.75f);
//自定义对话框高度为报国内容
lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
//自定义对话框位置位于屏幕的中间
//常用位置:TOP、BOTTOM、LEFT、RIGHT、CENTER、CENTER_VERTICAL、CENTER_HORIZONTAL、FILL、FILL_HORIZONTAL、FILL_VERTICAL、CLIP_VERTICAL、CLIP_HORIZONTAL等
lp.gravity = Gravity.CENTER;
dialogWindow.setAttributes(lp);
cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
}
});
confirm.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
}
});
dialog.show();
总结
//将自定义view设置到对话框中
builder.setView(view)
dialog.setContentView(view);
问题
屏幕旋转后,Activity被销毁,Dialog会消失
解决方法:
//保存状态
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
if (dialog != null && dialog.isShowing()) {
outState.putBoolean("DIALOG_SHOWN", true);
}
}
//获取状态
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState != null) {
if (savedInstanceState.getBoolean("DIALOG_SHOWN")) {
showDialog();
...
FragmentDialog
待更新