Android中的多种对话框样式详解

来源:互联网 发布:oracle 清除表数据 编辑:程序博客网 时间:2024/06/15 16:06

文章来源:http://bbs.itheima.com/thread-219659-1-1.html

  在Android应用开发中,程序与用户交互的方式会直接影响到用户的使用体验,一直是产品经理们最为注重的部分,而对话框又是与用户交互必不可少的部分。我们经常会需要在界面上弹出一个对话框,让用户点击对话框的某个按钮、选项,或者是输入一些文本,从而知道用户的做了什么操作,或是下达了什么指令。
  Android中为我们提供了一个类,叫AlertDialog,可以创建很多样式的对话框,极大的方便了程序员的编码。下面我们来看看AlertDialog该如何使用。

1.确定取消对话框

  首先来看看应用中最常见的一种对话框,对话框中有一个确定按钮和一个取消按钮,用于用户做出某个操作后,程序对其做最终确认,防止用户误操作。


这里写图片描述

代码如下:
  注意AlertDialog的构造方法是protected的,所以不能直接创建AlertDialog的对象,需要先创建AlertDialog的一个内部类Builder ,借助Builder对象创建对话框。

AlertDialog.Builder builder = new Builder(this);//设置对话框图标,可以使用自己的图片,Android本身也提供了一些图标供我们使用builder.setIcon(android.R.drawable.ic_dialog_alert);//设置对话框标题builder.setTitle("警告");//设置对话框内的文本builder.setMessage("手机准备自爆!");//设置确定按钮,并给按钮设置一个点击侦听,注意这个OnClickListener使用的是DialogInterface类里的一个内部接口builder.setPositiveButton("确定", new OnClickListener() {        @Override        public void onClick(DialogInterface dialog, int which) {                // 执行点击确定按钮的业务逻辑        }});//设置取消按钮builder.setNegativeButton("取消", new OnClickListener() {        @Override        public void onClick(DialogInterface dialog, int which) {                // 执行点击取消按钮的业务逻辑        }});//使用builder创建出对话框对象AlertDialog dialog = builder.create();//显示对话框dialog.show();

除了Positive和Negative,还可以设置一个Neutral按钮,表示中立,既不确定也不取消。


这里写图片描述

builder.setNeutralButton("纠结", new OnClickListener() {        @Override        Public void onClick(DialogInterface dialog, int which) {        }});     

2.列表对话框

如果需要给用户提供的选择比较多,就不要使用按钮了,按钮过多对话框会很不好看,我们可以设置一个列表,在列表中列出所有提供的选项。


这里写图片描述

AlertDialog.Builder builder = new Builder(this);builder.setIcon(android.R.drawable.ic_dialog_alert);builder.setTitle("手机准备自爆!");//定义列表中的选项final String[] items = new String[]{        "关机",        "重启手机",        "写遗书",        "跑路",        "把手机送给小明"};//设置列表选项builder.setItems(items, new OnClickListener() {        //点击任何一个列表选项都会触发这个方法        //arg1:点击的是哪一个选项        @Override        public void onClick(DialogInterface dialog, int which) {        }});// 取消选择builder.setNegativeButton("取消", new OnClickListener() {        @Override        public void onClick(DialogInterface dialog, int which) {        }});builder.show();

3.单选对话框

选项较多时也可以使用单选对话框,给用户提供多个选项,但只允许选择一个。

![这里写图片描述](http://bbs.itheima.com/data/attachment/forum/201507/29/112353ztd38zwkrajd3zra.jpg.thumb.jpg)代码如下:  注意对话框的图标、title、message等都不是必须的,看需求确定是否要设置,需要特别注意的一点,非确定取消对话框,不要设置message,比如像以下的单选对话框,设置了message,那么单选选项就会无法显示。
AlertDialog.Builder builder = new Builder(this);builder.setTitle("请选择您的家乡");//定义单选的选项String[] items = new String[]{        "地球",        "塞伯坦",        "M78星云",        "氪星"};//设置单选选项//arg1:表示默认选中哪一项,-1表示没有默认选中项builder.setSingleChoiceItems(items, -1, new OnClickListener() {        //点击任何一个单选选项都会触发这个侦听方法执行        //arg1:点击的是哪一个选项        @Override        public void onClick(DialogInterface dialog, int which) {                // 执行选中某个选项后的业务逻辑                //点击某个选项后,触发onClick执行,要让对话框消失                dialog.dismiss();        }});// 设置取消按钮,用户可以决定不选builder.setNegativeButton("取消", new OnClickListener() {        @Override        public void onClick(DialogInterface dialog, int which) {        }});//直接调用builder的show方法同样可以显示对话框,其内部也是先创建对话框对象,然后调用对话框的show()builder.show();

4.多选对话框

还有一个对选对话框,给用户提供多个选项,并且可以同时选择多个。

![这里写图片描述](http://bbs.itheima.com/data/attachment/forum/201507/29/112438h8z0l8in7urn525r.jpg.thumb.jpg)代码如下:
AlertDialog.Builder builder = new Builder(this);builder.setTitle("请选择您需要的武器");//定义单选的选项String[] items = new String[]{        "AK-47",        "开山刀",        "啤酒瓶",        "板凳",        "创可贴"};//使用一个boolean数组表示默认选中项,因为是多选,可以有多个默认选中项,哪项被选中就把值赋为truefinal boolean[] checkedItems = new boolean[]{        false,        false,        false,        true,        True};//设置多选选项//arg2:设置多选侦听builder.setMultiChoiceItems(items, checkedItems, new OnMultiChoiceClickListener() {        //点击任何一个多选选项都会触发这个方法        //arg1:点击的是哪一个选项        //arg2:当前选项是否被选中        @Override        public void onClick(DialogInterface dialog, int which, boolean isChecked) {                //点击某个选项,就改变该选项对应的boolean值,记录其是否被选中                checkedItems[which] = isChecked;        }});//用户选好要选的选项后,点击确定按钮builder.setPositiveButton("确定", new OnClickListener() {        @Override        public void onClick(DialogInterface dialog, int which) {                // TODO Auto-generated method stub        }});// 取消选择builder.setNegativeButton("取消", new OnClickListener() {        @Override        public void onClick(DialogInterface dialog, int which) {        }});builder.show();

5.View对话框

对话框中还可以直接显示一个View对象,这个特性使对话框的样式更多种多样了。

![这里写图片描述](http://bbs.itheima.com/data/attachment/forum/201507/29/112542s0og8y8qplo3fglv.jpg.thumb.jpg)代码如下:
AlertDialog.Builder builder = new Builder(this);builder.setIcon(android.R.drawable.ic_dialog_info);builder.setTitle("请输入内容");//创建一个EditText对象设置为对话框中显示的View对象builder.setView(new EditText(MainActivity.this));//用户选好要选的选项后,点击确定按钮builder.setPositiveButton("确定", new OnClickListener() {        @Override        public void onClick(DialogInterface dialog, int which) {        }});// 取消选择builder.setNegativeButton("取消", new OnClickListener() {        @Override        public void onClick(DialogInterface dialog, int which) {        }});builder.show();

对话框中显示的View对象,除了直接new一个指定的组件,也可以使用布局文件来定义一个布局,然后填充成View对象,用这样的自定义View可以让对话框可以显示出很复杂的内容。


这里写图片描述

这个对话框的内容是用布局文件定义的,很明显,是一个水平线性布局包裹一个输入框和一个文本框,这个布局文件比较简单,代码就不展示了

代码如下:

AlertDialog.Builder builder = new Builder(this);builder.setIcon(android.R.drawable.ic_dialog_info);builder.setTitle("请输入验证码");//把布局文件先填充成View对象View view = View.inflate(MainActivity.this, R.layout.item, null);//把填充得来的view对象设置为对话框显示内容builder.setView(view);builder.setPositiveButton("确定", new OnClickListener() {        @Override        public void onClick(DialogInterface dialog, int which) {        }});builder.setNegativeButton("取消", new OnClickListener() {        @Override        public void onClick(DialogInterface dialog, int which) {        }});builder.show();

6.自定义Dialog

  AlertDialog的基类是Dialog,我们可以定义一个类直接继承Dialog,重写里面的方法,同样可以实现自定义对话框的样式。
  首先先创建一个布局文件,定义对话框的样式。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:orientation="vertical" >        <TextView                 android:layout_width="wrap_content"                android:layout_height="wrap_content"                android:text="这是自定义的对话框"                android:textSize="25sp"                android:layout_gravity="center_horizontal"        />        <Button                 android:id="@+id/bt"                android:layout_width="120dp"                android:layout_height="wrap_content"                android:text="确定"                android:layout_gravity="center_horizontal"        /></LinearLayout>

然后定义一个类直接继承Dialog。

public class MyDialog extends Dialog{        //类似于自定义View,必须实现一个非默认的构造方法        protected MyDialog(Context context) {                super(context);        }        @Override        protected void onCreate(Bundle savedInstanceState) {                super.onCreate(savedInstanceState);                //设置不显示对话框标题栏                requestWindowFeature(Window.FEATURE_NO_TITLE);                //设置对话框显示哪个布局文件                setContentView(R.layout.dialog);                //对话框也可以通过资源id找到布局文件中的组件,从而设置点击侦听                Button bt = (Button) findViewById(R.id.bt);                bt.setOnClickListener(new View.OnClickListener() {                        @Override                        public void onClick(View v) {                                dismiss();                        }                });        }}

创建这个MyDialog的对象,然后show()

MyDialog dialog = new MyDialog(this);dialog.show();

最终显示效果:

![这里写图片描述](http://bbs.itheima.com/data/attachment/forum/201507/29/112729fo22jvofo0c8q808.jpg.thumb.jpg)其实Activity本身也可以作为一个Dialog使用,只要在清单文件中的activity标签中加上这样一条属性就可以了,不用再做任何改动。
android:theme="@android:style/Theme.Dialog"

Activity启动后的显示效果就会变成一个对话框的样式,就加一行代码,这里就不展示效果了,小伙伴们自己试试吧。


这里写图片描述

这样出来的效果是一个圆一直在转动,不过有时可能需要一个能反映“加载进度”的进度条,那么需要改变进度条对话框的样式。

ProgressDialog dialog = new ProgressDialog(this);//改变样式,水平样式的进度条可以显示出当前百分比进度dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);dialog.setTitle("正在加载,请稍候...");//设置进度条最大值dialog.setMax(100);dialog.show();


这里写图片描述

设置了setMax,还要设置setProgress,开启一个子线程,在run方法中执行setProgress就可以改变进度条对话框中的进度了。