Android开发必知--几种不同对话框的实现

在开发过程中,与用户交互式免不了会用到对话框以实现更好的用户体验,所以掌握几种对话框的实现方法还是非常有必要的。在看具体实例之前先对AlertDialog做一个简单介绍。AlertDialog是功能最丰富、实践应用最广的对话框,它可以生成各种内容的对话框。但实际上AlertDialog生成的对话框总体可分为以下4个区域:图标区、标题区、内容区、按钮区。

一般创建一个对话框需要经过以下几步:

1、创建AlertDialog.Builder对象。

2、调用AlertDialog.Builder的setTitle()或者setCustomTitle()方法设置标题。

3、调用AlertDialog.Builder的setIcon()方法设置标题logo。

4、调用AlertDialog.Builder的相关方法设置对话框内容。

5、调用AlertDialog.Builder的setPositiveButton()、setNegativeButton()或setNeutralButton()方法添加多个按钮。

6、调用AlertDialog.Builder的create()方法创建AlertDialog对象,再调用AlertDialog对象的show()方法将该对话框显示出来。

其中,第4步设置对话框的内容,这里有6种方法来指定:

·setMessage():设置对话框内容为简单文本内容。

·setItems():设置对话框内容为简单列表项。

·setSingleChoiceItems():设置对话框内容为单选列表项。

·setMultiChoiceItems():设置对话框内容为多选列表项。

·setAdapter():设置对话框内容为自定义列表项。

·setView():设置对话框内容为自定义View。

下面通过几个实例来介绍一下AlertDialog的用法。

1、显示提示消息的对话框。

typescript 复制代码
 1 /**
 2      * 显示提示消息的对话框
 3      * @author codingblock 2015-8-11
 4      * @param  context     上下文
 5      * @param  title       对话框标题
 6      * @param  message     对话框提示内容
 7      * @return
 8      */
 9     public AlertDialog.Builder simpleDialog(final Context context, String title, String message){
10         AlertDialog.Builder builder = new AlertDialog.Builder(context)
11         .setTitle(title)
12         .setIcon(R.drawable.ic_launcher)
13         .setMessage(message)
14         .setPositiveButton("完成", null)
15         .setNegativeButton("取消", null);
16         return builder;
17     }

上面的代码是将一个简单提示对话框封装成了一个方法,调用时可以省去重复代码,直接传递title,message等参数即可,其中该对话框用设置了icon,title等属性,还调用了setPositiveButton()和setNegativeButton()方法添加按钮,因为该方法(simpleDialog())在这里仅提供调用,所以没有实现按钮的具体功能,可在实际调用中重写这两个方法从而实现具体功能。

调用方式如下,其他几种方式的对话框与此方法调用方式基本一致,以下就不再一一给出。

typescript 复制代码
 1   public void onClickSimple(View v){
 2         builder = new Dialog().simpleDialog(this, "简单对话框", "对话框内容");
 3         builder.setPositiveButton("确定", new OnClickListener() {
 4             @Override
 5             public void onClick(DialogInterface arg0, int arg1) {
 6                 //确定
 7             }
 8         })
 9         .setNegativeButton("取消", new OnClickListener() {
10             @Override
11             public void onClick(DialogInterface arg0, int arg1) {
12                 //取消
13             }
14         });
15         builder.create().show();
16     }

除此之外,AlertDialog.Builder还提供了setNeutralButton()方法来添加一个装饰性的按钮。因此Android的对话一共可以生成三个按钮的对话框。

2、简单列表项对话框

java 复制代码
 1   /**
 2      * 简单列表项对话框
 3      * @author codingblock 2015-8-11
 4      * @param  context     上下文
 5      * @param  title       对话框标题
 6      * @param  items       对话框列表项CharSequence类型数组,也可根据需要改成其他类型
 7      * @return
 8      */
 9     public AlertDialog.Builder simpleListDialog(final Context context, String title, final CharSequence[] items){
10         AlertDialog.Builder builder = new AlertDialog.Builder(context)
11         .setTitle(title)
12         .setIcon(R.drawable.ic_launcher)
13         .setItems(items, new OnClickListener() {
14             
15             @Override
16             public void onClick(DialogInterface dialog, int which) {
17                 Toast.makeText(context, "您选中了:"+ items[which], Toast.LENGTH_SHORT).show();
18             }
19         });
20         return builder;
21     }

上面的代码通过调用setItems()方法为对话框设置了多个列表项,其中setItems的第一个参数可以是Charsequence和int类型。

3、单选列表项对话框

java 复制代码
 1   /**
 2      * 单选列表项对话框
 3      * @author codingblock 2015-8-11
 4      * @param  context     上下文
 5      * @param  title       对话框标题
 6      * @param  items       对话框列表项 CharSequence类型数组
 7      * @return
 8      */
 9     public AlertDialog.Builder simpleChoiceDialog(final Context context, String title, final CharSequence[] items){
10         AlertDialog.Builder builder = new AlertDialog.Builder(context)
11         .setTitle(title)
12         .setIcon(R.drawable.ic_launcher)
13         //第二个参数为默认选中项, 0:代表默认选中第一项
14         .setSingleChoiceItems(items, 0, new OnClickListener() {
15             @Override
16             public void onClick(DialogInterface dialog, int which) {
17                 Toast.makeText(context, "您选中了:"+ items[which], Toast.LENGTH_SHORT).show();
18             }
19         });
20         return builder;
21     }

以上代码通过调用setSingleChoiceItems()方法创建了带单选列表的对话框。调用setSingleChoiceItems()方法时既可传入数组作为参数,也可传入Cursor(相当于数据库查询结果集)作为参数,也可传入ListAdapter作为参数。另外,如果传入ListAdapter作为参数,则由ListAdapter来提供多个列表项组件。

4、多选列表对话框

java 复制代码
 1   /**
 2      * 多选列表项对话框
 3      * @author codingblock 2015-8-11
 4      * @param  context     上下文
 5      * @param  title            对话框标题
 6      * @param  items       对话框列表项 CharSequence类型数组
 7      * @param  checked     对话框初始选定状态  boolean类型数组
 8      * @return
 9      */
10     public AlertDialog.Builder multiChoiceDialog(final Context context, String title, final CharSequence[] items, final boolean[] checked){
11         AlertDialog.Builder builder = new AlertDialog.Builder(context)
12         .setTitle(title)
13         .setIcon(R.drawable.ic_launcher)
14         //第二个参数为默认选中项,是一个boolean型的数组
15         .setMultiChoiceItems(items, checked, null)
16         .setPositiveButton("完成", null)
17         .setNegativeButton("取消", null);
18         return builder;
19     }

以上代码通过调用setMultiChoiceItems()方法创建了一个多选列表的对话框。在调用setMultiChoiceItems()时既可传入数组作为参数,也可传入Cursor作为参数。需要注意的时在调用setMultiChoiceItems()方法添加多选列表时,还需要传入一个boolean[]参数,该参数有两个作用:①设置初始化时选中哪些列表项。②该boolean[]类型的参数还可用于动态的获取多选列表项的选中状态。

5、自定义列表项对话框

typescript 复制代码
 1   /**
 2      * 自定义列表项对话框
 3      * @author codingblock 2015-8-11
 4      * @param  context     上下文
 5      * @param  title       对话框标题
 6      * @param  items       对话框列表项 String类型数组,也可更具需要改成其他类型
 7      * @return
 8      */
 9     public AlertDialog.Builder customListDialog(final Context context, String title, String[] items){
10         AlertDialog.Builder builder = new AlertDialog.Builder(context)
11         .setTitle(title)
12         .setIcon(R.drawable.ic_launcher)
13         .setAdapter(new ArrayAdapter<String>(context, R.layout.array_item, R.id.tv_item, items), null)
14         .setPositiveButton("完成", null)
15         .setNegativeButton("取消", null);
16         return builder;
17     }

以上代码通过setAdapter()设置了对话框的内容,该方法需要传入一个Adapter参数,这样的话,就可以通过Adapter实现多个组件的绘制。其中setAdapter方法中调用的布局文件array_item.xml代码如下:

ini 复制代码
 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     android:id="@+id/container"
 4     android:layout_width="match_parent"
 5     android:layout_height="match_parent"
 6     android:gravity="center"
 7     android:padding="10dp"
 8     android:orientation="horizontal">
 9     <ImageView
10         android:id="@+id/iv_img"
11         android:layout_width="30dp"
12         android:layout_height="30dp"
13         android:src="@drawable/ic_launcher" />
14     <TextView
15         android:id="@+id/tv_item"
16         android:layout_width="fill_parent"
17         android:layout_height="wrap_content"
18         android:layout_margin="10dp"
19         android:gravity="center"
20         android:text="列表项" />
21 </LinearLayout>

其实,不仅setAdapter()方法可以接受Adapter作为参数,setSingleChoice()方法也可以接受Adapter参数,也就是说,使用setSingleChoice()方法也可以实现自定义列表项对话框。

6、自定义View的对话框

java 复制代码
 1   /**
 2      * 自定义View的对话框
 3      * @author codingblock 2015-8-11
 4      * @param  context     上下文
 5      * @param  title       对话框标题
 6      */
 7     public AlertDialog.Builder customeViewDialog(final Context context, String title){
 8         LinearLayout loginDialog = (LinearLayout)LayoutInflater.from(context).inflate(R.layout.login_dialog, null);
 9         AlertDialog.Builder builder = new AlertDialog.Builder(context)
10         .setTitle(title)
11         .setIcon(R.drawable.ic_launcher)
12         .setView(loginDialog)
13         .setPositiveButton("完成", null)
14         .setNegativeButton("取消", null);
15         return builder;
16     }

以上代码通过setView()方法调用自定义的布局文件显示界面。代码中首先显示装载了login_dialog.xml文件,并返回该文件对应的View,接下来程序调用了setView()方法来显示View。

其中的login_dialog.xml文件代码如下:

ini 复制代码
 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     android:id="@+id/container"
 4     android:layout_width="match_parent"
 5     android:layout_height="match_parent"
 6     android:padding="10dp"
 7     android:orientation="vertical">
 8     <LinearLayout 
 9         android:layout_width="fill_parent"
10         android:layout_height="wrap_content"
11         android:orientation="horizontal">
12         <TextView 
13             android:id="@+id/tv_name"
14             android:layout_width="wrap_content"
15             android:layout_height="wrap_content"
16             android:text="用户名:"/>
17         <EditText 
18             android:id="@+id/et_name"
19             android:layout_width="match_parent"
20             android:layout_height="wrap_content"
21             android:focusable="true"
22             android:hint="input name" />
23     </LinearLayout>
24     <LinearLayout 
25         android:layout_width="fill_parent"
26         android:layout_height="wrap_content"
27         android:orientation="horizontal">
28         <TextView 
29             android:id="@+id/tv_pwd"
30             android:layout_width="wrap_content"
31             android:layout_height="wrap_content"
32             android:text="密码:"/>
33         <EditText 
34             android:id="@+id/et_pwd"
35             android:layout_width="match_parent"
36             android:layout_height="wrap_content"
37             android:hint="input password" />
38     </LinearLayout>
39 </LinearLayout>

最后针对Android程序员,我这边给大家整理了一些指南,

更多Android进阶指南 可以详细Vx关注公众号:Android老皮 解锁 《Android十大板块文档》

1.Android车载应用开发系统学习指南(附项目实战)

2.Android Framework学习指南,助力成为系统级开发高手

3.2023最新Android中高级面试题汇总+解析,告别零offer

4.企业级Android音视频开发学习路线+项目实战(附源码)

5.Android Jetpack从入门到精通,构建高质量UI界面

6.Flutter技术解析与实战,跨平台首要之选

7.Kotlin从入门到实战,全方面提升架构基础

8.高级Android插件化与组件化(含实战教程和源码)

9.Android 性能优化实战+360°全方面性能调优

10.Android零基础入门到精通,高手进阶之路

敲代码不易,关注一下吧。ღ( ´・ᴗ・` ) 🤔

相关推荐
肖哥弹架构14 小时前
Spring 全家桶使用教程
java·后端·程序员
IT杨秀才4 天前
自己动手写了一个协程池
后端·程序员·go
程序员麻辣烫6 天前
像AI一样思考
程序员
一颗苹果OMG7 天前
关于进游戏公司实习的第一周
前端·程序员
万少7 天前
你会了吗 HarmonyOS Next 项目级别的注释规范
前端·程序员·harmonyos
楽码8 天前
彻底理解时间?在编程中使用原子钟
后端·算法·程序员
江南一点雨8 天前
又一家培训机构即将倒闭!打工人讨薪无果,想报名的小伙伴擦亮眼睛~
java·程序员
用户86178277365188 天前
ELK 搭建 & 日志集成
java·后端·程序员
河北小田9 天前
局部变量成员变量、引用类型、this、static
java·后端·程序员
文心快码 Baidu Comate9 天前
新一代的程序员如何培养自己的核心竞争力?(一)
人工智能·程序员·ai编程·文心快码·智能编程助手