引言

开发中,我们会有很多地方使用 Dialog 来展示一些提示信息或设置信息。如:用户提示、进度展示、时间设置、日期设置等。

下面我和大家一些学习下Android中常用的几种Dialog吧~


首先,先介绍下 Dialog 中那些类的关系

先来一波源码

public interface DialogInterface {
......
}
public class Dialog implements DialogInterface
......
public class AlertDialog extends Dialog implements DialogInterface {
......
}
public class ProgressDialog extends AlertDialog {
......
}
public class TimePickerDialog extends AlertDialog implements OnClickListener, OnTimeChangedListener {
......
}
public class DatePickerDialog extends AlertDialog implements OnClickListener, OnDateChangedListener {
......
}

从上述代码中,我们可以看出:

  • Dialog 类 是一个基类。且源码文档中也给出了说明:
  • Known Direct Subclasses(已知子类)

AlertDialogCharacterPickerDialogMediaRouteChooserDialogMediaRouteControllerDialogPresentation

  • 开发中,与:进度、时间、日历 有关的Dialog,继承于AlertDialog。源码文档如下述:
  • Known Direct Subclasses(已知子类)

DatePickerDialogProgressDialogTimePickerDialog


既然明确了继承关系,那么我们就来用代码演示下开发中最基本的使用方式(此处只做一些基本的使用演示,更高级的使用后续再和大家共同学习~)

普通的对话框

代码演示

        //创建一个 AlertDialog.Builder 对象
AlertDialog.Builder builder = new AlertDialog.Builder(this);
//给对话框添加title
builder.setTitle("普通对话框");
//给对话框添加内容
builder.setMessage("这是一个内容");
//给对话框添加点击事件
builder.setNeutralButton("未知", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Log.e("对话框", "未知 which = " + which);
}
}); builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Log.e("对话框", "取消 which = " + which);
}
}); builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Log.e("对话框", "确定 which = " + which);
}
});
//切记勿忘~开启dialog
builder.show();

效果图(机型不同,展示可能稍有差异,也可以自定义样式)


带单选的对话框

代码演示

        //给 AlertDialog 设置单选(四种参数形式)
//Builder setSingleChoiceItems(@ArrayRes int itemsId, int checkedItem, final OnClickListener listener)
//Builder setSingleChoiceItems(Cursor cursor, int checkedItem, String labelColumn, final OnClickListener listener)
//Builder setSingleChoiceItems(ListAdapter adapter, int checkedItem, final OnClickListener listener)
//setSingleChoiceItems(CharSequence[] items, int checkedItem, final OnClickListener listener)
//参数1:所有选项。参数2:默认一个选择。参数3:点击事件监听
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("单选对话框");
String[] items = new String[]{"男", "女", "都不是"};
builder.setSingleChoiceItems(items, 0, new DialogInterface.OnClickListener() {
@Override //which:点击位置
public void onClick(DialogInterface dialog, int which) {
Log.e("对话框", "which = " + which);
}
});
builder.show();

效果图(机型不同,展示可能稍有差异,也可以自定义样式)


带多选的对话框

代码演示

        //给 AlertDialog 设置多选(三种参数形式)
//Builder setMultiChoiceItems(@ArrayRes int itemsId, boolean[] checkedItems, final OnMultiChoiceClickListener listener)
//Builder setMultiChoiceItems(Cursor cursor, String isCheckedColumn, String labelColumn, final OnMultiChoiceClickListener listener)
//Builder setMultiChoiceItems(CharSequence[] items, boolean[] checkedItems, final OnMultiChoiceClickListener listener)
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("多选对话框");
String[] items = new String[]{"西瓜", "葡萄", "香蕉", "苹果", "都要"};
boolean[] checks = new boolean[]{true, false, false, false, false};
builder.setMultiChoiceItems(items, checks, new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
Log.e("对话框", "which = " + which + ", isChecked = " + isChecked);
}
});
builder.show();

效果图(机型不同,展示可能稍有差异,也可以自定义样式)


带进度条的对话框

代码演示

        final ProgressDialog progress = new ProgressDialog(this);
progress.setTitle("进度条对话框");
//设置进度条样式(可更改,推荐看源码)
progress.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
//设置一个最大进度值
progress.setMax(100);
//开启一个线程模拟进度
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i <= 100; i++) {
SystemClock.sleep(100);
progress.setProgress(i);
}
}
}).start();
progress.show();

效果图(机型不同,展示可能稍有差异,也可以自定义样式)


时间选择对话框

代码演示

        //TimePickerDialog(Context context, OnTimeSetListener listener, int hourOfDay, int minute, boolean is24HourView)
//TimePickerDialog(Context context, int themeResId, OnTimeSetListener listener, int hourOfDay, int minute, boolean is24HourView)
//themeResId:the resource ID of the theme to apply to this dialog
TimePickerDialog timePicker = new TimePickerDialog(this, new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
Log.e("对话框", "hourOfDay = " + hourOfDay + ", minute = " + minute);
}
}, 0, 0, true);
timePicker.show();

效果图(机型不同,展示可能稍有差异,也可以自定义样式)


日历选择对话框

代码演示

        //DatePickerDialog要求Android-API最低版本是24
//DatePickerDialog(Context context)
//DatePickerDialog(Context context, int themeResId)
//DatePickerDialog(Context context, OnDateSetListener listener, int year, int month, int dayOfMonth)
//DatePickerDialog(Context context, int themeResId, OnDateSetListener listener, int year, int monthOfYear, int dayOfMonth)
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
DatePickerDialog datePicker = new DatePickerDialog(this);
//当我们创建对象的时候,底层源码调用的都是下述的私有构造器
//this(context, 0, null, Calendar.getInstance(), -1, -1, -1)
// private DatePickerDialog(Context context,
// int themeResId, //自定义样式
// OnDateSetListener listener, //监听
// Calendar calendar, //日历类
// int year, //指定年
// int monthOfYear, //指定月
// int dayOfMonth) //指定日
datePicker.show();
}

效果图(机型不同,展示可能稍有差异,也可以自定义样式)



PS::期待与大家更多的交流~让我们共同进步。技术正在改变着世界!

Android开发中常用Dialog(普通弹窗&时间选择器&日历选择器)的更多相关文章

  1. Android源码浅析(四)——我在Android开发中常用到的adb命令,Linux命令,源码编译命令

    Android源码浅析(四)--我在Android开发中常用到的adb命令,Linux命令,源码编译命令 我自己平时开发的时候积累的一些命令,希望对你有所帮助 adb是什么?: adb的全称为Andr ...

  2. Android开发中常用的库总结(持续更新)

    这篇文章用来收集Android开发中常用的库,都是实际使用过的.持续更新... 1.消息提示的小红点 微信,微博消息提示的小红点. 开源库地址:https://github.com/stefanjau ...

  3. Android开发中常用的ListView列表的优化方式ViewHolder

    在Android开发中难免会遇到大量的数据加载到ListView中进行显示, 然后其中最重要的数据传递桥梁Adapter适配器是常用的,随着市场的需 求变化ListView'条目中的内容是越来越多这就 ...

  4. Android开发中常用的设计模式

    首先需要说明的是,这篇博文灵感来自于 http://www.cnblogs.com/qianxudetianxia/archive/2011/07/29/2121547.html ,在这里,博主已经很 ...

  5. NO.4 Android开发中常用框架及工具

    android-pulltorefresh 一个强大的拉动刷新开源项目,支持各种控件下拉刷新ListView.ViewPager.WevView.ExpandableListView.GridView ...

  6. Android 开发中常用小技巧

    TextView中的getTextSize返回值是以像素(px)为单位的, 而setTextSize()是以sp为单位的. 所以如果直接用返回的值来设置会出错,解决办法是 用setTextSize() ...

  7. Android 开发中常用 ADB 命令总结

    adb 的全称为 Android Debug Bridge,就是起到调试桥的作用.通过 adb 我们可以在 Eclipse 中方便通过 DDMS 来调试 Android 程序,说白了就是 debug ...

  8. android开发中常用的快捷键

    Eclipse快捷键-方便查找,呵呵,记性不好 行注释/销注释 Ctrl+/  块注释/销注释/XML注释 Ctrl+Shift+/   Ctrl+Shift+\查找 查找替换 Ctrl+H  Ctr ...

  9. Android开发中常用的一些小技巧(转载)

    http://www.jb51.net/article/61135.htm Activity.startActivities() 常用于在应用程序中间启动其他的Activity. TextUtils. ...

随机推荐

  1. 为何你还不懂得如何使用Python协程

    关于我 一个有思想的程序猿,终身学习实践者,目前在一个创业团队任team lead,技术栈涉及Android.Python.Java和Go,这个也是我们团队的主要技术栈. Github:https:/ ...

  2. python之web自动化验证码识别解决方案

    验证码识别解决方案 对于web应用程序来讲,处于安全性考虑,在登录的时候,都会设置验证码,验证码的类型种类繁多,有图片中辨别数字字母的,有点击图片中指定的文字的,也有算术计算结果的,再复杂一点就是滑动 ...

  3. Mybatis 中的<![CDATA[ ]]>浅析

    在使用mybatis 时我们sql是写在xml 映射文件中,如果写的sql中有一些特殊的字符的话,在解析xml文件的时候会被转义,但我们不希望他被转义,所以我们要使用<![CDATA[ ]]&g ...

  4. count(*) count(1) count(column)的区别

    count(1)中的1并不是指第一个column: count(*)和count(1)一样,包括对值为NULL的统计: count(column)不包括对值为NULL的统计,这里的column指的不是 ...

  5. Kafka集群环境配置

    Kafka集群环境配置 1 环境准备 1.1 集群规划 Node02 Node03 Node04 zk zk zk kafka kafka kafka 1.2 jar包下载 安装包:kafka_2.1 ...

  6. MyBatis源码下载安装教程

    一.下载(原文链接:http://www.studyshare.cn/software/details/1177/1 github下载:去下载 百度网盘下载:去下载 提取码:d1er 二.安装 1.检 ...

  7. Codeforces 976F

    题意略. 思路:为了保证每个点都有至少k条边覆盖,我们可以让二分图的左半边与源点s相连,连容量为indegree[i] - k的边(如果正着想不好想,我们可以想它的反面, 限制它反面的上限,从而保证我 ...

  8. PHP CURL根据详细地址获取腾讯地图经纬度

    <?php $address = "广东省广州市天河区"; $point = getPoint($address); var_dump($point);//输出经纬度 /** ...

  9. mysql where、group by、having

    今天重新温习一遍mysql的知识 先来讲讲where.group by.having group by :是将记录中的数据,按照条件进行分组: having:是将分组后的数据加上条件筛选,区别于whe ...

  10. helm部署Redis哨兵集群

    介绍 Redis Sentinel集群是由若干Sentinel节点组成的分布式集群,可以实现故障发现.故障自动转移.配置中心和客户端通知. 如下图: Redis Sentinel 故障转移过程: 从这 ...