参考于:
Android之Dialog详解
7种形式的Android Dialog使用举例
(一)概述
android中的dialog可以分为5类:一般对话框,列表对话框,单选按钮对话框,多选对话框,自定义对话框。
(二)一般对话框
样式:
AlertDialog.Builder builder = new AlertDialog.Builder(this); //先得到构造器
builder.setTitle("提示"); //设置标题
builder.setMessage("是否确认退出"); //设置内容
builder.setIcon(R.mipmap.ic_launcher); //自定义图标
builder.setCancelable(false); //设置是否能点击,对话框的其他区域取消
builder.setPositiveButton("确认", new DialogInterface.OnClickListener() { //设置其确认按钮和监听事件
@Override
public void onClick(DialogInterface dialog, int which) {
// which,是哪一个按钮被触发
// 其值如下:
// Dialog.BUTTON_NEGATIVE 忽略
// Dialog.BUTTON_POSITIVE 确认
// Dialog.BUTTON_NEUTRAL 取消
dialog.dismiss();
}
});
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() { //设置其取消按钮和监听事件
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
builder.setNegativeButton("忽略", new DialogInterface.OnClickListener() { //设置其忽略按钮和监听事件
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
builder.create(); //创建对话框
builder.show(); //显示对话框
}
可以利用Which的值,把以上的代码简化:
private void dialog1_1(){
//先new出一个监听器,设置好监听
DialogInterface.OnClickListener dialogOnclicListener=new DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int which) {
switch(which){
case Dialog.BUTTON_POSITIVE:
Toast.makeText(MainActivity.this, "确认" + which, Toast.LENGTH_SHORT).show();
break;
case Dialog.BUTTON_NEGATIVE:
Toast.makeText(MainActivity.this, "取消" + which, Toast.LENGTH_SHORT).show();
break;
case Dialog.BUTTON_NEUTRAL:
Toast.makeText(MainActivity.this, "忽略" + which, Toast.LENGTH_SHORT).show();
break;
}
}
};
//dialog参数设置
AlertDialog.Builder builder=new AlertDialog.Builder(this); //先得到构造器
builder.setTitle("提示"); //设置标题
builder.setMessage("是否确认退出?"); //设置内容
builder.setIcon(R.mipmap.ic_launcher);//设置图标,图片id即可
builder.setPositiveButton("确认",dialogOnclicListener);
builder.setNegativeButton("取消", dialogOnclicListener);
builder.setNeutralButton("忽略", dialogOnclicListener);
builder.create().show();
}
(三)列表对话框
样式:
final String items[] = {"AAA","BBB","CCC"};
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("提示"); //设置标题
//builder.setMessage("是否确认退出?"); //设置内容
builder.setIcon(R.mipmap.ic_launcher);//设置图标,图片id即可
//设置列表显示,注意设置了列表显示就不要设置builder.setMessage()了,否则列表不起作用。
builder.setItems(items,new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
Toast.makeText(MainActivity.this, items[which], Toast.LENGTH_SHORT).show();
}
});
builder.setPositiveButton("确定",new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
Toast.makeText(MainActivity.this, "确定", Toast.LENGTH_SHORT).show();
}
});
builder.create().show();
(四)单选按钮对话框
final String items[]={"男","未知","女"};
AlertDialog.Builder builder=new AlertDialog.Builder(this); //先得到构造器
builder.setTitle("提示"); //设置标题
builder.setIcon(R.mipmap.ic_launcher); //设置图标,图片id即可
//设置单选按钮
// items 为列表项
// 0 为默认选中第一个
// 第三个参数是监听器
builder.setSingleChoiceItems(items,0,new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//dialog.dismiss();
Toast.makeText(MainActivity.this, items[which], Toast.LENGTH_SHORT).show();
}
});
// 设置监听器
builder.setPositiveButton("确定",new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
Toast.makeText(MainActivity.this, "确定", Toast.LENGTH_SHORT).show();
}
});
builder.create().show();
(五)多选按钮对话框
final String items[]={"篮球","足球","排球"};
final boolean selected[]={true,false,true};
AlertDialog.Builder builder=new AlertDialog.Builder(this); //先得到构造器
builder.setTitle("提示"); //设置标题
builder.setIcon(R.mipmap.ic_launcher);//设置图标,图片id即可
// 参数一:列表项
// 参数二:默认打勾的
// 参数三:监听器
builder.setMultiChoiceItems(items,selected,new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
// dialog.dismiss();
Toast.makeText(MainActivity.this, items[which]+isChecked, Toast.LENGTH_SHORT).show();
}
});
// 确认按钮
builder.setPositiveButton("确定",new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
Toast.makeText(MainActivity.this, "确定", Toast.LENGTH_SHORT).show();
//android会自动根据你选择的改变selected数组的值。
for (int i=0;i<selected.length;i++){
Log.e("hongliang",""+selected[i]);
}
}
});
builder.create().show();
(六)自定义对话框
dialog的布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textPersonName"
android:gravity="center"
android:hint="name"
android:ems="10"
android:id="@+id/editText_name"
android:layout_gravity="center_horizontal" />
<EditText
android:gravity="center"
android:hint="password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textPassword"
android:ems="10"
android:id="@+id/editText_password"
android:layout_gravity="center_horizontal" />
</LinearLayout>
代码:
//其实对话框里面很多东西都是可以自定义的
// 1. 图标
// 2. 整个布局
AlertDialog.Builder builder=new AlertDialog.Builder(this); //先得到构造器
builder.setTitle("自定义dialog"); //设置标题
builder.setIcon(R.mipmap.ic_launcher);//设置图标,图片id即可
// 载入布局
LayoutInflater inflater = getLayoutInflater();
View layout = inflater.inflate(R.layout.dialog_cell,null);
builder.setView(layout);
// 对布局中的控件监听
EditText editText_name = (EditText) layout.findViewById(R.id.editText_name);
EditText editText_password = (EditText) layout.findViewById(R.id.editText_password);
editText_name.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this,"name is on click",Toast.LENGTH_LONG).show();
}
});
// 确认按钮
builder.setPositiveButton("确定",new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
// 显示
builder.create().show();
(七)总结
其实dialog算是挺简单的东西,不过想要驾驭它,不要以为掌握以上的就可以了,你应该完全读透dialog这个控件的源码,并且自己能写出来。虽然说,不建议重复制作轮子,但是,我们必须有造轮子的能力。
以后我会写一篇造dialog轮子的文章,不过不知道是什么时候了。