Android———最详细的系统对话框使用

在实际应用开发中,用到系统对话框中的情况几乎是没有的。按开发流程来说,UI工程师都会给出每一个弹窗的样式,故而在实际开发中都是自定义弹窗的。
即使用到的地方不多,但是我们也是需要了解并且能熟练的运用它,下面为大家奉上各种系统对话框的实现。
目录

系统对话框的几种类型与实现
在项目的实际开发中,用到的系统对话框几乎是没有的。原因大概包含以下几点:
- 样式过于单一,不能满足大部分实际项目中的需求。
- 对话框的样式会根据手机系统版本的不同而变化。不能达到统一的样式。
- 能实现的功能过于简单。
在这里先附上下面代码中出现文本的string.xml文件。
<string name="dialog_normal_content">我是普通dialog</string>
<string name="dialog_normal_more_button_content">我是普通多按钮dialog</string>
<string name="dialog_btn_confirm_text">确定</string>
<string name="dialog_btn_cancel_text">取消</string>
<string name="dialog_btn_neutral_text">忽略</string>
<string name="dialog_btn_confirm_hint_text">您点击了确定按钮</string>
<string name="dialog_btn_cancel_hint_text">您点击了取消按钮</string>
<string name="dialog_btn_neutral_hint_text">您点击了忽略按钮</string>
1、普通对话框
在实际项目开发中,此类型对话框中用到的地方要比其他类型的对话框多一些。但是考虑UI统一问题,也会很少用。
运行截图:

代码:
private void showNormalDialog(){
//创建dialog构造器
AlertDialog.Builder normalDialog = new AlertDialog.Builder(this);
//设置title
normalDialog.setTitle(getString(R.string.dialog_normal_text));
//设置icon
normalDialog.setIcon(R.mipmap.ic_launcher_round);
//设置内容
normalDialog.setMessage(getString(R.string.dialog_normal_content));
//设置按钮
normalDialog.setPositiveButton(getString(R.string.dialog_btn_confirm_text)
, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(DialogActivity.this,getString(R.string.dialog_btn_confirm_hint_text)
,Toast.LENGTH_SHORT).show();
dialog.dismiss();
}
});
//创建并显示
normalDialog.create().show();
}
系统对话框都是支持链式调用的,举例:
new AlertDialog.Builder(this)
.setTitle(getString(R.string.dialog_normal_text))
.setIcon(R.mipmap.ic_launcher_round)
.setMessage(getString(R.string.dialog_normal_content))
.setPositiveButton(getString(R.string.dialog_btn_confirm_text)
, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(DialogActivity.this,getString(R.string.dialog_btn_confirm_hint_text)
,Toast.LENGTH_SHORT).show();
dialog.dismiss();
}
})
.create()
.show();
下面的代码都是可以用链式调用的,这里就不展示了。
2、普通对话框(多按钮)
在系统对话框中最多出现三个按钮,即PositiveButton(确定)、NegativeButton(取消)、NeutralButton(忽略)。
运行截图:

代码:
private void showNormalMoreButtonDialog(){
AlertDialog.Builder normalMoreButtonDialog = new AlertDialog.Builder(this);
normalMoreButtonDialog.setTitle(getString(R.string.dialog_normal_more_button_text));
normalMoreButtonDialog.setIcon(R.mipmap.ic_launcher_round);
normalMoreButtonDialog.setMessage(getString(R.string.dialog_normal_more_button_content));
//设置按钮
normalMoreButtonDialog.setPositiveButton(getString(R.string.dialog_btn_confirm_text)
, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(DialogActivity.this
,getString(R.string.dialog_btn_confirm_hint_text),Toast.LENGTH_SHORT).show();
dialog.dismiss();
}
});
normalMoreButtonDialog.setNegativeButton(getString(R.string.dialog_btn_cancel_text)
, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(DialogActivity.this,
getString(R.string.dialog_btn_cancel_hint_text),Toast.LENGTH_SHORT).show();
dialog.dismiss();
}
});
normalMoreButtonDialog.setNeutralButton(getString(R.string.dialog_btn_neutral_text)
, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(DialogActivity.this,
getString(R.string.dialog_btn_neutral_hint_text),Toast.LENGTH_SHORT).show();
dialog.dismiss();
}
});
normalMoreButtonDialog.create().show();
}
也可以用下面的实现方式,和上面的代码效果是一样的。
private void showNormalMoreButtonDialog(){
DialogInterface.OnClickListener setListener = null;
AlertDialog.Builder normalMoreButtonDialog = new AlertDialog.Builder(this);
normalMoreButtonDialog.setTitle(getString(R.string.dialog_normal_more_button_text));
normalMoreButtonDialog.setIcon(R.mipmap.ic_launcher_round);
normalMoreButtonDialog.setMessage(getString(R.string.dialog_normal_more_button_content));
setListener = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which){
case DialogInterface.BUTTON_POSITIVE:
Toast.makeText(DialogActivity.this,
getString(R.string.dialog_btn_confirm_hint_text),Toast.LENGTH_SHORT).show();
dialog.dismiss();
break;
case DialogInterface.BUTTON_NEUTRAL:
Toast.makeText(DialogActivity.this
,getString(R.string.dialog_btn_neutral_hint_text),Toast.LENGTH_SHORT).show();
dialog.dismiss();
break;
case DialogInterface.BUTTON_NEGATIVE:
Toast.makeText(DialogActivity.this
,getString(R.string.dialog_btn_cancel_hint_text),Toast.LENGTH_SHORT).show();
dialog.dismiss();
break;
}
}
};
normalMoreButtonDialog.setPositiveButton(getString(R.string.dialog_btn_confirm_text),setListener);
normalMoreButtonDialog.setNegativeButton(getString(R.string.dialog_btn_cancel_text),setListener);
normalMoreButtonDialog.setNeutralButton(getString(R.string.dialog_btn_neutral_text),setListener);
normalMoreButtonDialog.create().show();
}
3、普通列表对话框
此种类型的对话框能实现简单的列表。
运行截图:

代码:
/**
* 普通列表dialog
*/
private void showListDialog(){
final String listItems[] = new String[]{"listItems1","listItems2","listItems3",
"listItems4","listItems5","listItems6"};
AlertDialog.Builder listDialog = new AlertDialog.Builder(this);
listDialog.setTitle(getString(R.string.dialog_list_text));
listDialog.setIcon(R.mipmap.ic_launcher_round);
/*
设置item 不能用setMessage()
用setItems
items : listItems[] -> 列表项数组
listener -> 回调接口
*/
listDialog.setItems(listItems,new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(DialogActivity.this,listItems[which],Toast.LENGTH_SHORT).show();
}
});
//设置按钮
listDialog.setPositiveButton(getString(R.string.dialog_btn_confirm_text)
, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
listDialog.create().show();
}
4、单选对话框
运行截图:

代码:
private void showRadioDialog(){
final String radioItems[] = new String[]{"radioItem1","radioItem1","radioItem1","radioItem1"};
AlertDialog.Builder radioDialog = new AlertDialog.Builder(this);
radioDialog.setTitle(getString(R.string.dialog_radio_text));
radioDialog.setIcon(R.mipmap.ic_launcher_round);
/*
设置item 不能用setMessage()
用setSingleChoiceItems
items : radioItems[] -> 单选选项数组
checkItem : 0 -> 默认选中的item
listener -> 回调接口
*/
radioDialog.setSingleChoiceItems(radioItems, 0, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(DialogActivity.this,radioItems[which],Toast.LENGTH_SHORT).show();
}
});
//设置按钮
radioDialog.setPositiveButton(getString(R.string.dialog_btn_confirm_text)
, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
radioDialog.create().show();
}
5、多选对话框
运行截图:

代码:
private void showCheckBoxDialog(){
final String checkBoxItems[] = new String[]{"checkBoxItems1","checkBoxItems2",
"checkBoxItems3","checkBoxItems4"};
final boolean isCheck[] = new boolean[]{false,true,true,false};
AlertDialog.Builder checkBoxDialog = new AlertDialog.Builder(this);
checkBoxDialog.setTitle(getString(R.string.dialog_check_box_text));
checkBoxDialog.setIcon(R.mipmap.ic_launcher_round);
/*
设置item 不能用setMessage()
用setMultiChoiceItems
items : radioItems[] -> 多选选项数组
checkItems : isCheck[] -> 是否选中数组
listener -> 回调接口
*/
checkBoxDialog.setMultiChoiceItems(checkBoxItems, isCheck
, new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
if (isChecked){
Toast.makeText(DialogActivity.this,
checkBoxItems[which] + " 选中",Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(DialogActivity.this,
checkBoxItems[which] + " 未选中",Toast.LENGTH_SHORT).show();
}
}
});
//设置按钮
checkBoxDialog.setPositiveButton(getString(R.string.dialog_btn_confirm_text)
, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
checkBoxDialog.create().show();
}
6、带输入框的弹窗
运行截图:

代码:
private void showEditDialog(){
final EditText edit = new EditText(this);
AlertDialog.Builder editDialog = new AlertDialog.Builder(this);
editDialog.setTitle(getString(R.string.dialog_edit_text));
editDialog.setIcon(R.mipmap.ic_launcher_round);
//设置dialog布局
editDialog.setView(edit);
//设置按钮
editDialog.setPositiveButton(getString(R.string.dialog_btn_confirm_text)
, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(DialogActivity.this,
edit.getText().toString().trim(),Toast.LENGTH_SHORT).show();
dialog.dismiss();
}
});
editDialog.create().show();
}
7、自定义布局的对话框
此类型的对话框在实际项目开发中用到的地方比提示对话框用到的地方要多一些,不过在项目几乎上都是自定义的对话框...
运行截图:

布局文件:custom_dialog_layout.xml
<TextView
android:id="@+id/dialog_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="15sp"
android:textColor="@color/colorPrimary"
android:gravity="center"
android:padding="12dp"/>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/ic_launcher"/>
<Button
android:id="@+id/dialog_btn_confirm"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/colorAccent"
android:textSize="15sp"
android:text="@string/dialog_btn_confirm_text"
android:layout_centerHorizontal="true"/>
<Button
android:id="@+id/dialog_btn_cancel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/colorAccent"
android:textSize="15sp"
android:text="@string/dialog_btn_cancel_text"
android:layout_centerHorizontal="true"
android:layout_alignParentRight="true"/>
</RelativeLayout>
</LinearLayout>
代码:
private void showLayoutDialog() {
//加载布局并初始化组件
View dialogView = LayoutInflater.from(this).inflate(R.layout.custom_dialog_layout,null);
TextView dialogText = (TextView) dialogView.findViewById(R.id.dialog_text);
Button dialogBtnConfirm = (Button) dialogView.findViewById(R.id.dialog_btn_confirm);
Button dialogBtnCancel = (Button) dialogView.findViewById(R.id.dialog_btn_cancel);
final AlertDialog.Builder layoutDialog = new AlertDialog.Builder(this);
layoutDialog.setTitle(getString(R.string.dialog_custom_layout_text));
layoutDialog.setIcon(R.mipmap.ic_launcher_round);
layoutDialog.setView(dialogView);
//设置组件
dialogText.setText("我是自定义layout的弹窗!!");
dialogBtnConfirm .setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(DialogActivity.this,"我是自定义layout的弹窗!!",Toast.LENGTH_SHORT).show();
}
});
dialogBtnConfirm .setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
layoutDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
dialog.dismiss();
}
});
}
});
layoutDialog.create().show();
}
以上就是Android系统弹窗的几种实现方式,几乎涵盖了能解决各种简单需求。其中自定义布局的方式奠定了自定义弹窗的基本实现。
尾语
可以看出上面的几种实现方式都是通过AlertDialog类实现的。有兴趣的可以看Android源码中的AlertDialog类实现。
我的个人博客:Jetictors
我的掘金:Jetictors
Github:Jetictors
欢迎各位大佬进群共同研究、探索
QQ群号:497071402
Android———最详细的系统对话框使用的更多相关文章
- Android———最详细的系统对话框(AlertDialog)详解
在实际应用开发中,用到系统对话框中的情况几乎是没有的.按开发流程来说,UI工程师都会给出每一个弹窗的样式,故而在实际开发中都是自定义弹窗的. 即使用到的地方不多,但是我们也是需要了解并且能熟练的运用它 ...
- Android系统对话框——自定义关闭
Android系统对话框--自定义关闭 Dialog是我们在项目中经常用到的,5.x以后的Dialog也很好看,很安卓风,Android也给我们提供了新的包,低版本可以显示一样的效果.我们在使用的导入 ...
- Android系统对话框
Android系统对话框 效果图 2个按钮的对话框 3个按钮的对话框 自定义View的对话框 单选对话框 多选对话框 列表框 Code XML <?xml version="1.0&q ...
- Android中制作自定义dialog对话框的实例
http://www.jb51.net/article/83319.htm 这篇文章主要介绍了Android中制作自定义dialog对话框的实例分享,安卓自带的Dialog显然不够用,因而我们要继 ...
- linux安装 Android Studio详细教程,支持性较差,需要安装最新底层库内核的linux
安装 Android Studio详细教程 libc6-i386 lib32stdc++6 lib32gcc1 lib32ncurses5 lib32z1 jdk1.8.0_25 android-st ...
- Firefly 3288又一次制作android和lubuntu双系统固件
又一次制作android和lubuntu双系统固件 因为本人改动了lubuntu的驱动和设备树信息,为了方便烧写系统,所以又一次制作了双系统的固件. Firefly wiki教程里有android固件 ...
- Android 12(S) 图形显示系统 - 应用建立和SurfaceFlinger的沟通桥梁(三)
1 前言 上一篇文章中我们已经创建了一个Native示例应用,从使用者的角度了解了图形显示系统API的基本使用,从这篇文章开始我们将基于这个示例应用深入图形显示系统API的内部实现逻辑,分析运作流程. ...
- Android 12(S) 图形显示系统 - SurfaceFlinger的启动和消息队列处理机制(四)
1 前言 SurfaceFlinger作为Android图形显示系统处理逻辑的核心单元,我们有必要去了解其是如何启动,初始化及进行消息处理的.这篇文章我们就来简单分析SurfaceFlinger这个B ...
- Android 12(S) 图形显示系统 - createSurface的流程(五)
题外话 刚刚开始着笔写作这篇文章时,正好看电视在采访一位92岁的考古学家,在他的日记中有这样一句话,写在这里与君共勉"不要等待幸运的降临,要去努力的掌握知识".如此朴实的一句话,此 ...
随机推荐
- 201521123012 《Java程序设计》第一周学习总结
一.本章学习内容 1.了解了JDK.JRE .JVM. 2.大概看过了Java的诞生.版本演进(JDK1.1.4,JDK1.1.5--JDK1.1.8,J2SE1.2--Java SE 8)以及三大平 ...
- java课程设计---计算器(201521123020 邱伟达)
1.团队课程设计博客链接 http://www.cnblogs.com/br0823/p/7064407.html 2.个人负责模板或任务说明 1.初始化按键 2.实现加减乘除开方乘方等运算 3.每个 ...
- Java 最常用类(前1000名) 来自GitHub 3000个项目
这篇文章主要介绍了最常用的1000个Java类(附代码示例),需要的朋友可以参考下 分析Github 3000个开源项目,粗略统计如下.括号内的数字是使用频率 0-3000. 下面的列表显示不全,完整 ...
- 多线程:深入Thread.sleep
一直都说,Threed.sleep是不会释放锁,而wait是释放锁的(对象锁),现理论上来分析一下. 由于CPU分配的每个线程的时间片极为短暂(一般为几十毫秒),所以,CPU通过不停地切换线程执行,这 ...
- MySql导入导出数据方法
导出全库备份到本地的目录 mysqldump -u$USER -p$PASSWD -h127.0.0.1 -P3306 --routines --default-character-set=utf8 ...
- 关于Visio Studio 2012使用Nuget获取Sqlite驱动包报错:“System.Data.SQLite.EF6”的架构版本与 NuGet 的版本 2.0.30625.9003 不兼容
背景 笔者的VS2012版本比较老旧,是几年以前下载的.平时添加三方包和驱动包都是手动添加.后来了解到有Nuget这个工具,如获至宝.可是在使用过程中却出了不少问题. 最初,笔者尝试使用Nuget添加 ...
- S3C2440 时钟设置分析(FCLK, HCLK, PCLK)
时钟对于一个系统的重要性不言而喻,时钟决定了系统发送数据的快慢,高性能的芯片往往能支持更快速度的时钟,从而提供更好的体验. S3C2440的输入时钟频率是12MHZ,对于这款芯片,显然速度是不够的,所 ...
- python基础之五大标准数据类型
学习一门语言,往往都是从Hello World开始. 但是笔者认为,在一个黑框框中输出一个"你好,世界"并没有什么了不起,要看透事物的本质,熟悉一门语言,就要了解其底层,就是我们常 ...
- SSM框架——Spring+SpringMVC+Mybatis的搭建教程
一:概述 SSM框架在项目开发中经常使用到,相比于SSH框架,它在仅几年的开发中运用的更加广泛. Spring作为一个轻量级的框架,有很多的拓展功能,最主要的我们一般项目使用的就是IOC和AOP. S ...
- HDFS概述(4)————HDFS权限
概述 Hadoop分布式文件系统(HDFS)的权限模型与POSIX模型的文件和目录权限模型一致.每个文件和目录与所有者和组相关联.该文件或目录将权限划分为所有者的权限,作为该组成员的其他用户的权限.以 ...