使用了Dialog,Android开发提升一个档次
嘚吧嘚
Dialog是什么呢?
dialog直译成中文是“会话,对话”的意思。
那么问题来了,是谁和谁对话呢?enmmmm。。。当然是“人”和“机器”了。
从效果上来看,就是“机器”弹出一个对话的窗口,告诉“人”有哪些选择或者该进行什么操作;然后“人”在窗口进行选择或操作,操作完成之后就完成了“人”和“机器”的一次对话。
以上是通俗的理解,接下来看一下Dialog的Android官方定义
Dialog的Android官方定义:
对话框是提示用户做出决定或输入额外信息的小窗口。对话框不会填充屏幕,通常用于需要用户采取行动才能继续执行的模式事件。
Dialog的生命周期是啥样子的?
“生命周期”这个名词相信大家并不陌生,最基础也是大家最熟悉的就是Activity的生命周期,如果大家学习过android课程的话,Activity的生命周期是最早学习的内容之一。
Dialog的生命周期:
create -> show -> dismiss
相比于Activity的生命周期也太简单了吧,就是一个有三个步骤的简单流程。
本人对“生命周期”这个词的理解
“生命周期”可以拆分为“生命”、“周”、“期”三部分。所有“生命”都有“起点”和“终点”两个点,即“生”和“死”。而在“生”和“死”之间还有做一些事情,而重复做一些事情形成闭环就是“周”这个字,有点周而复始的意味。而“期”这个字指定是,一条生命从“生”开始,重复做一些事情,最后到“死”的这段时间或者期限。(纯粹是个人理解,如果理解的不正确请指正
)
人比其他动物高级在哪里?要是细说的话确实有很多方面,在于人强大的学习能力。
在漫长的进化过程中为了更好的生存下去,不断的学习制造和使用兵器,不断学习更多的知识来认识世界,我认为这也是学习的本质。但后来学习有了更高的境界,通过学习得到一些人生感悟,也就是古人追求的“吾十有五而志于学,三十而立,四十而不惑,五十而知天命,六十而耳顺,七十而从心所欲,不逾矩”。
现在已经很少能感受到古人的学习风气了,说起来也有些伤感。
在理解“生命周期”的过程中有了一丝人生感悟。
个人感悟:
所有生命都有“生”和“死”,但生命的精彩在于“生”和“死”之间做的事情。每个人的选择不一样做的事情也不一样,没有必要非要去做轰天动地的大事,只要活的充实不虚度光阴就不白在这世间走一遭,平凡而又精彩。
Dialog的使用
为什么说学会了Dialog,Android开发提升一个档次?
想象一个场景——退出登录
如果不使用Dialog的效果:
像这样点击“退出登录”就直接退出登录感觉不太友好,为什么这么说呢?再想象一个场景,如果你一不小心碰到了“退出登录”这个按钮就直接退出登录,你再次登录还要输入用户名、密码、验证码等信息,是不是很麻烦呢?现在是不是感觉不太友好了呢?
接下来介绍一下Dialog
普通Dialog
先看效果:
现在是不是感觉比之前的高档了呢?话不多说,接下来学习一下Dialog怎么使用。
layout布局
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center">
<Button
android:id="@+id/dialog"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="退出登录" />
</LinearLayout>
</LinearLayout>
MainActivity
Button btn = findViewById(R.id.dialog);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//通过AlertDialog.Builder实例化一个AlertDialog对象
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
//设置标题
builder.setTitle("警告");
//设置图标
builder.setIcon(R.drawable.csdn);
//设置提示信息内容
builder.setMessage("确定要退出登录吗?");
//确定按钮(标签,监听器)
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
});
//取消按钮(标签,监听器)
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, "点击了取消", Toast.LENGTH_SHORT).show();
}
});
//忽略按钮(标签,监听器)
builder.setNeutralButton("忽略", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, "点击了忽略", Toast.LENGTH_SHORT).show();
}
});
//显示弹窗
builder.create().show();
}
});
SingleDialog(单选Dialog)
SingleDialo是列表Dialog的一种,只能选择一个选项。
比较经典的场景就是性别选择,先看一下效果图:
首先在layout布局中加上一个“单选列表”的Button按钮
<Button
android:id="@+id/singleDialog"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="单选列表" />
定义可供选择的性别的列表
final String[] items = {"男", "女", "不告诉你"};
然后构建单选对话框
private void singleDialog() {
choice = 0;//默认选择第一个
AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity.this);
dialog.setIcon(R.drawable.csdn);//图标
dialog.setTitle("性别");
/**
* 1.items:定义的单选选项数组
* 2.checkedItem:默认被选中的选项。默认不选中为-1,选中数组第一个为0,选中数组第二个为1,以此类推
* 3.listener:监听器
*/
dialog.setSingleChoiceItems(items, 0, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
choice = which;
Toast.makeText(MainActivity.this, "点击了" + items[which], Toast.LENGTH_SHORT).show();
}
});
//交互按钮栏
//确定按钮(标签,监听器)
dialog.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, "选择了" + items[choice], Toast.LENGTH_SHORT).show();
}
});
//添加取消按钮
dialog.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
dialog.create().show();
}
多选Dialog(MultiDialog)
MultiDialog也是列表Dialog的一种,不过是可以多选的列表Dialog。
所有app都有用户完善个人信息的场景,个人信息中有“爱好”这一栏,先看看看看Dialog的效果:
在layout布局中添加一个“多选列表”的按钮
<Button
android:id="@+id/multiDialog"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="多选列表" />
定义可供选择的爱好的列表
final String[] hobby = {"吃", "喝", "玩", "乐", "学习", "睡觉"};
构建多选对话弹窗
choices = new ArrayList<>();
AlertDialog.Builder multiBuilder = new AlertDialog.Builder(MainActivity.this);
multiBuilder.setIcon(R.drawable.csdn);
multiBuilder.setTitle("爱好");
boolean[] checkedItems = {false, true, false, false, false, false};//android会自动根据你选择的改变该数组的值。
for (int i = 0; i < checkedItems.length; i++) {
if (checkedItems[i] == true) {
choices.add(i);
}
}
multiBuilder.setMultiChoiceItems(hobby, checkedItems, new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
if (isChecked) {
choices.add(which);
Toast.makeText(MainActivity.this, "选择了" + hobby[which], Toast.LENGTH_SHORT).show();
} else {
choices.remove(choices.indexOf(which));
Toast.makeText(MainActivity.this, "取消了" + hobby[which], Toast.LENGTH_SHORT).show();
}
}
}).setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String s = "您选择了:";
for (Integer item : choices) {
s += hobby[item] + "、";
}
Toast.makeText(MainActivity.this, s, Toast.LENGTH_LONG).show();
}
}).setNeutralButton("再想想", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
Toast.makeText(MainActivity.this, "让我再想想", Toast.LENGTH_LONG).show();
}
}).show();
LoadDialog(加载等待的Dialog)
加载等待效果:
在layout布局中添加“加载弹窗”的按钮
<Button
android:id="@+id/loadDialog"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="加载弹窗" />
构建加载对话框
ProgressDialog progressDialog = new ProgressDialog(MainActivity.this);
progressDialog.setIcon(R.drawable.csdn);
progressDialog.setMessage("加载中......");
//是否形成一个加载动画 true表示不明确加载进度形成转圈动画 false表示明确加载进度
progressDialog.setIndeterminate(true);
//点击返回键或者dialog四周是否关闭dialog true表示可以关闭 false表示不可关闭
progressDialog.setCancelable(true);
progressDialog.show();
DownloadDialog(带有进度条的Dialog)
带有进度加载的对话弹窗,一般常见于下载任务
效果:
在layout布局中添加一个“下载弹窗”的按钮
<Button
android:id="@+id/downloadDialog"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="下载弹窗" />
构建下载对话弹框
final int MAX_VALUE = 100;
final ProgressDialog progressDialog = new ProgressDialog(MainActivity.this);
progressDialog.setProgress(0);
progressDialog.setTitle("文件下载中......");
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setMax(MAX_VALUE);
progressDialog.show();
new Thread(new Runnable() {
@Override
public void run() {
int progress = 0;
while (progress < MAX_VALUE) {
try {
Thread.sleep(100);
progress++;
progressDialog.setProgress(progress);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//加载完毕自动关闭dialog
progressDialog.cancel();
}
}).start();
EditDialog(可输入的Dialog)
EditDialog是可以编辑的对话弹框
在layout布局中添加一个“个性签名”的按钮
<Button
android:id="@+id/editDialog"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="个性签名" />
构建可编辑的对话框
final EditText editText = new EditText(MainActivity.this);
AlertDialog.Builder inputDialog = new AlertDialog.Builder(MainActivity.this);
inputDialog.setTitle("请输入个性签名").setView(editText);
inputDialog.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, "您的个性签名为:" + editText.getText().toString(), Toast.LENGTH_SHORT).show();
}
}).setNeutralButton("让我再想想", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
}).show();
自定义Dialog
可以根据自己的功能需要自定义Dialog,就以调差问卷为例来学习一下吧。
先看效果:
自己定义的页面布局questionnaire.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="你的名字:"
android:textColor="#111"
android:textSize="24dp"></TextView>
<EditText
android:layout_width="match_parent"
android:layout_height="match_parent"
android:inputType="text" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="你的手机:"
android:textColor="#111"
android:textSize="24dp"></TextView>
<EditText
android:layout_width="match_parent"
android:layout_height="match_parent"
android:inputType="phone" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="你的意见:"
android:textColor="#111"
android:textSize="24dp"></TextView>
<EditText
android:layout_width="match_parent"
android:layout_height="match_parent"
android:inputType="text" />
</LinearLayout>
</LinearLayout>
构建自定义的调查问卷对话框
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this).setView(R.layout.questionnaire);
builder.setTitle("调查问卷");
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, "感谢你们完成了调查问卷", Toast.LENGTH_SHORT).show();
}
}).setNeutralButton("退出", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, "真遗憾", Toast.LENGTH_SHORT).show();
}
}).show();
DatePickerDialog(日期选择弹窗)
在layout布局中添加新按钮
<Button
android:id="@+id/birth"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="设置生日" />
构建日期选择会话弹窗
//获取当前系统时间
Calendar calendar = Calendar.getInstance();
// 获取当前的年
int year = calendar.get(calendar.YEAR);
// 获取当前的月
int month = calendar.get(calendar.MONTH);
// 获取当前月的第几天
final int day = calendar.get(calendar.DAY_OF_MONTH);
DatePickerDialog datePickerDialog = new DatePickerDialog(MainActivity.this, new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
birth.setText(year + "年" + (month + 1) + "月" + day + "日");
}
}, year, month, day);
datePickerDialog.show();
TimePickerDialog(时间选择弹窗)
在layout布局中添加新按钮
<Button
android:id="@+id/time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="设置时间" />
构建时间选择会话弹窗
//获取当前系统时间
Calendar calendar = Calendar.getInstance();
// 获取当前的小时
int hour = calendar.get(calendar.HOUR);
// 获取当前的分钟
int minute = calendar.get(calendar.MINUTE);
TimePickerDialog timePickerDialog = new TimePickerDialog(MainActivity.this, new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
time.setText(hourOfDay + " : " + minute);
}
}, hour, minute, true);
timePickerDialog.show();
源代码下载
Dialog的代码有需要的自行下载一下:Github代码下载