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

Android中为我们提供了一个类,叫AlertDialog,可以创建很多样式的对话框,极大的方便了程序员的编码。下面我们来看看AlertDialog该如何使用。

1.确定取消对话框

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

<ignore_js_op>

android好看的输入框 android 输入框样式_上传

1.jpg (21.67 KB, 下载次数: 0)

下载附件  保存到相册

2015-7-29 11:19 上传

 

代码如下:

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

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

复制代码

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

<ignore_js_op>

android好看的输入框 android 输入框样式_上传_02

2.jpg (20.68 KB, 下载次数: 0)

下载附件  保存到相册

2015-7-29 11:21 上传

 

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

复制代码2.列表对话框

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

<ignore_js_op>

android好看的输入框 android 输入框样式_上传_03

3.jpg (11.96 KB, 下载次数: 0)

下载附件  保存到相册

2015-7-29 11:22 上传

 

代码如下:

1. AlertDialog.Builder builder = new Builder(this);
2. builder.setIcon(android.R.drawable.ic_dialog_alert);
3. builder.setTitle("手机准备自爆!");
4. //定义列表中的选项
5. final String[] items = new String[]{
6.         "关机",
7.         "重启手机",
8.         "写遗书",
9.         "跑路",
10.         "把手机送给小明"
11. };
12. //设置列表选项
13. builder.setItems(items, new OnClickListener() {
14.         //点击任何一个列表选项都会触发这个方法
15.         //arg1:点击的是哪一个选项
16.         @Override
17.         public void onClick(DialogInterface dialog, int which) {
18.         }
19. });
20. // 取消选择
21. builder.setNegativeButton("取消", new OnClickListener() {
22.         @Override
23.         public void onClick(DialogInterface dialog, int which) {
24.         }
25. });
26. builder.show();

复制代码3.单选对话框

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

<ignore_js_op>

android好看的输入框 android 输入框样式_上传_04

4.jpg (12.23 KB, 下载次数: 2)

下载附件  保存到相册

2015-7-29 11:23 上传

 

代码如下:

title、message等都不是必须的,看需求确定是否要设置,需要特别注意的一点,非确定取消对话框,不要设置message,比如像以下的单选对话框,设置了message,那么单选选项就会无法显示。


1. AlertDialog.Builder builder = new Builder(this);
2. builder.setTitle("请选择您的家乡");
3. //定义单选的选项
4. String[] items = new String[]{
5.         "地球",
6.         "塞伯坦",
7.         "M78星云",
8.         "氪星"
9. };
10. //设置单选选项
11. //arg1:表示默认选中哪一项,-1表示没有默认选中项
12. builder.setSingleChoiceItems(items, -1, new OnClickListener() {
13.         //点击任何一个单选选项都会触发这个侦听方法执行
14.         //arg1:点击的是哪一个选项
15.         @Override
16.         public void onClick(DialogInterface dialog, int which) {
17.                 // 执行选中某个选项后的业务逻辑
18.                 //点击某个选项后,触发onClick执行,要让对话框消失
19.                 dialog.dismiss();
20.         }
21. });
22. // 设置取消按钮,用户可以决定不选
23. builder.setNegativeButton("取消", new OnClickListener() {
24.         @Override
25.         public void onClick(DialogInterface dialog, int which) {
26.         }
27. });
28. //直接调用builder的show方法同样可以显示对话框,其内部也是先创建对话框对象,然后调用对话框的show()
29. builder.show();

复制代码4.多选对话框

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

<ignore_js_op>

android好看的输入框 android 输入框样式_ide_05

5.jpg (32.23 KB, 下载次数: 0)

下载附件  保存到相册

2015-7-29 11:24 上传

 

代码如下:


1. AlertDialog.Builder builder = new Builder(this);
2. builder.setTitle("请选择您需要的武器");
3. //定义单选的选项
4. String[] items = new String[]{
5.         "AK-47",
6.         "开山刀",
7.         "啤酒瓶",
8.         "板凳",
9.         "创可贴"
10. };
11. //使用一个boolean数组表示默认选中项,因为是多选,可以有多个默认选中项,哪项被选中就把值赋为true
12. final boolean[] checkedItems = new boolean[]{
13.         false,
14.         false,
15.         false,
16.         true,
17.         True
18. };
19. //设置多选选项
20. //arg2:设置多选侦听
21. builder.setMultiChoiceItems(items, checkedItems, new OnMultiChoiceClickListener() {
22.         //点击任何一个多选选项都会触发这个方法
23.         //arg1:点击的是哪一个选项
24.         //arg2:当前选项是否被选中
25.         @Override
26.         public void onClick(DialogInterface dialog, int which, boolean isChecked) {
27.                 //点击某个选项,就改变该选项对应的boolean值,记录其是否被选中
28.                 checkedItems[which] = isChecked;
29.         }
30. });
31. //用户选好要选的选项后,点击确定按钮
32. builder.setPositiveButton("确定", new OnClickListener() {
33.         @Override
34.         public void onClick(DialogInterface dialog, int which) {
35.                 // TODO Auto-generated method stub
36.         }
37. });
38. // 取消选择
39. builder.setNegativeButton("取消", new OnClickListener() {
40.         @Override
41.         public void onClick(DialogInterface dialog, int which) {
42.         }
43. });
44. builder.show();

复制代码5.View对话框

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

<ignore_js_op>

android好看的输入框 android 输入框样式_android好看的输入框_06

6.jpg (12.67 KB, 下载次数: 0)

下载附件  保存到相册

2015-7-29 11:25 上传

 

代码如下:

1. AlertDialog.Builder builder = new Builder(this);
2. builder.setIcon(android.R.drawable.ic_dialog_info);
3. builder.setTitle("请输入内容");
4. //创建一个EditText对象设置为对话框中显示的View对象
5. builder.setView(new EditText(MainActivity.this));
6. //用户选好要选的选项后,点击确定按钮
7. builder.setPositiveButton("确定", new OnClickListener() {
8.         @Override
9.         public void onClick(DialogInterface dialog, int which) {
10.         }
11. });
12. // 取消选择
13. builder.setNegativeButton("取消", new OnClickListener() {
14.         @Override
15.         public void onClick(DialogInterface dialog, int which) {
16.         }
17. });
18. builder.show();

复制代码

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

<ignore_js_op>

android好看的输入框 android 输入框样式_上传_07

7.jpg (14.56 KB, 下载次数: 0)

下载附件  保存到相册

2015-7-29 11:26 上传

 

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

代码如下:

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

复制代码6.自定义Dialog

的基类是Dialog,我们可以定义一个类直接继承Dialog,重写里面的方法,同样可以实现自定义对话框的样式。

    首先先创建一个布局文件,定义对话框的样式。

1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
2.         android:layout_width="match_parent"
3.         android:layout_height="match_parent"
4.         android:orientation="vertical" >
5.         <TextView
6.                 android:layout_width="wrap_content"
7.                 android:layout_height="wrap_content"
8.                 android:text="这是自定义的对话框"
9.                 android:textSize="25sp"
10.                 android:layout_gravity="center_horizontal"
11.         />
12.         <Button
13.                 android:id="@+id/bt"
14.                 android:layout_width="120dp"
15.                 android:layout_height="wrap_content"
16.                 android:text="确定"
17.                 android:layout_gravity="center_horizontal"
18.         />
19. </LinearLayout>

复制代码

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

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

复制代码

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

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

复制代码

    最终显示效果:

<ignore_js_op>

android好看的输入框 android 输入框样式_ide_08

8.jpg (14.36 KB, 下载次数: 0)

下载附件  保存到相册

2015-7-29 11:27 上传

 

    其实Activity本身也可以作为一个Dialog使用,只要在清单文件中的activity标签中加上这样一条属性就可以了,不用再做任何改动。

  1. android:theme="@android:style/Theme.Dialog"

复制代码

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

7.进度条对话框

ProgressDialog上镜率也不小呢,直接创建该类对象,show()就可以了。

1. ProgressDialog dialog = new ProgressDialog(this);
2. dialog.setTitle("正在加载,请稍候...");
3. dialog.show();

复制代码<ignore_js_op>

android好看的输入框 android 输入框样式_ide_09

9.jpg (5.39 KB, 下载次数: 0)

下载附件  保存到相册

2015-7-29 11:28 上传

 

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

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

复制代码<ignore_js_op>

android好看的输入框 android 输入框样式_Android_10

10.jpg (5.01 KB, 下载次数: 0)

下载附件  保存到相册

2015-7-29 11:28 上传

 

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