1、Dialog概述
  对话框一般是一个出现在当前Activity之上的一个小窗口,处于下面的Activity失去焦点, 对话框接受所有的用户交互。
对话框一般用于提示信息和与当前应用程序直接相关的小功能。

2、Dialog 分类:
  警告对话框 AlertDialog : 一个可以有0到3个按钮, 一个单选框或复选框的列表的对话框. 警告对话框可以创建大多数的交互界面, 是推荐的类型。
  进度对话框 ProgressDialog: 显示一个进度环或者一个进度条. 由于它是 AlertDialog 的扩展, 所以它也支持按钮。
  日期选择对话框 ProgressDialog : 让用户选择一个日期。
  时间选择对话框 TimePickerDialog : 让用户选择一个时间。

3、Dialog应用
  a、AlertDialog一般用法:
    取得创建者的类,AlertDialog.Builder builder = new Builder(Context);然后通过builder.setXX一系列方法来设置属性;
  最后builder.create().show()来显示Dialog。

  b、ProgressDialog、ProgressDialog、TimePickerDialog 用法:

    有些区别,是直接 new XXDialog(Context); 然后通过实例化的dialog.setXX设置属性;最后直接dialog.show()展示。

  c、代码实例

  实现如下9中Dialog

  

  按钮就不一一点进去演示,直接看源码:

  

    /**多个按钮信息框 **/
private static final int DIALOG_1 = 2;
/**列表框 **/
private static final int DIALOG_2 = 3;
/**进度条框 **/
private static final int DIALOG_3 = 4;
/**单项选择列表框 **/
private static final int DIALOG_4 = 5;
/**多项选择列表框 **/
private static final int DIALOG_5 = 6;
/**自定义布局 **/
private static final int DIALOG_6 = 7;
/**读取进度框 **/
private static final int DIALOG_7 = 8;
/**自定义布局 **/
private static final int DIALOG_8 = 9;
/**读取进度框 **/
private static final int DIALOG_9 = 10; private ProgressDialog pDialog;
private DatePickerDialog dDialog;
private TimePickerDialog tDialog;
private Calendar c;
final String[] items = {"item0","item1","itme2","item3","itme4"};
ArrayList <Integer>MultiChoiceID = new ArrayList <Integer>(); @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); Button button1 = (Button) findViewById(R.id.button1);
button1.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
CreatDialog(DIALOG_1);
}
}); Button button2 = (Button) findViewById(R.id.button2);
button2.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
CreatDialog(DIALOG_2);
}
}); Button button3 = (Button) findViewById(R.id.button3);
button3.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
CreatDialog(DIALOG_3);
//mProgressDialog.setProgress(0);
}
}); Button button4 = (Button) findViewById(R.id.button4);
button4.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
CreatDialog(DIALOG_4);
}
}); Button button5 = (Button) findViewById(R.id.button5);
button5.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
CreatDialog(DIALOG_5);
}
}); Button button6 = (Button) findViewById(R.id.button6);
button6.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
CreatDialog(DIALOG_6);
}
}); Button button7 = (Button) findViewById(R.id.button7);
button7.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
CreatDialog(DIALOG_7);
}
});
Button button8 = (Button) findViewById(R.id.button8);
button8.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
CreatDialog(DIALOG_8);
}
}); Button button9 = (Button) findViewById(R.id.button9);
button9.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
CreatDialog(DIALOG_9);
}
});
} public void CreatDialog(int id) {
AlertDialog.Builder builder = new Builder(DialogDemoActivity.this);
switch (id) {
case DIALOG_1:
builder.setIcon(R.drawable.ic_launcher);
builder.setTitle("投票");
builder.setMessage("您认为什么样的内容吸引你?");
builder.setPositiveButton("有趣的", new DialogInterface.OnClickListener() { @Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
showDialog("您选择了有趣的!");
} });
builder.setNeutralButton("有内涵的", new DialogInterface.OnClickListener() { @Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
showDialog("您选择了有内涵的!");
} });
builder.setNegativeButton("其他", new DialogInterface.OnClickListener() { @Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
showDialog("您选择了其他!");
} });
break;
case DIALOG_2:
builder.setTitle("列表框"); builder.setItems(items, new DialogInterface.OnClickListener() { @Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
showDialog("您选择了"+items[which]);
} });
break;
case DIALOG_3:
pDialog = new ProgressDialog(DialogDemoActivity.this);
pDialog.setIcon(R.drawable.ic_launcher);
pDialog.setTitle("带进度条的");
pDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pDialog.setMax(100);
pDialog.setButton("ok", new DialogInterface.OnClickListener() { @Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub }
});
pDialog.setButton2("cancle", new DialogInterface.OnClickListener() { @Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub }
});
pDialog.show();
new Thread(this).start();
return;
case DIALOG_4:
builder.setTitle("单列表选择框"); builder.setSingleChoiceItems(items, 0, new DialogInterface.OnClickListener() { @Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
showDialog("你选择的id为" + which + " , " + items[which]);
}
});
break;
case DIALOG_5:
MultiChoiceID.clear();
builder.setTitle("多列表选择框"); builder.setMultiChoiceItems(items
, new boolean[]{false,false,false,false,false}
,new DialogInterface.OnMultiChoiceClickListener() {
public void onClick(DialogInterface dialog, int whichButton,
boolean isChecked) {
if(isChecked) {
MultiChoiceID.add(whichButton);
showDialog("你选择的id为" + whichButton + " , " + items[whichButton]);
}else {
MultiChoiceID.remove(whichButton);
} }
});
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
String str = "";
int size = MultiChoiceID.size();
for (int i = 0 ;i < size; i++) {
str+= items[MultiChoiceID.get(i)] + ", ";
}
showDialog("你选择的是" + str);
}
});
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) { }
});
break;
case DIALOG_6: builder.setTitle("自定义对话框");
LayoutInflater layoutInflater = LayoutInflater.from(this);
final View layout = layoutInflater.inflate(R.layout.test, null); builder.setView(layout); builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
EditText userName = (EditText) layout.findViewById(R.id.etUserName);
EditText password = (EditText) layout.findViewById(R.id.etPassWord);
showDialog("姓名 :" + userName.getText().toString() + "密码:" + password.getText().toString() );
}
});
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) { }
});
break;
case DIALOG_7:
pDialog = new ProgressDialog(DialogDemoActivity.this);
pDialog.setIcon(R.drawable.ic_launcher);
pDialog.setTitle("循环进度");
pDialog.setMessage("正在读取");
pDialog.setIndeterminate(true); // 设置进度条不明确,即一直在滚动,不清楚进度
pDialog.setCancelable(true); // 设置 返回键 是否取消 进度框
pDialog.show();
return;
case DIALOG_8:
c= Calendar.getInstance();
dDialog = new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() { @Override
public void onDateSet(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
// TODO Auto-generated method stub }
}, c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DAY_OF_MONTH));
dDialog.show();
return;
case DIALOG_9:
c= Calendar.getInstance();
tDialog = new TimePickerDialog( //创建TimePickerDialog对象
this,
new TimePickerDialog.OnTimeSetListener(){ //创建OnTimeSetListener监听器
@Override
public void onTimeSet(TimePicker tp, int hourOfDay, int minute) {
}
},
c.get(Calendar.HOUR_OF_DAY), //传入当前小时数
c.get(Calendar.MINUTE), //传入当前分钟数
false
);
tDialog.show();
return;
} builder.create().show(); } private void showDialog(String str) {
new AlertDialog.Builder(DialogDemoActivity.this)
.setMessage(str)
.show();
} @Override
public void run() {
int Progress = 0;
while(Progress < 100) {
try {
Thread.sleep(100);
Progress++;
pDialog.incrementProgressBy(1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} }

  其中自定义Dialog的布局文件test.xml

 <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:orientation="horizontal"
android:id="@+id/dialog">
<LinearLayout
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:orientation="horizontal"
android:id="@+id/dialogname"> <TextView android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:id="@+id/tvUserName"
android:text="姓名:" />
<EditText android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:id="@+id/etUserName"
android:minWidth="200dip"/>
</LinearLayout>
<LinearLayout
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:orientation="horizontal"
android:id="@+id/dialognum"
android:layout_below="@+id/dialogname"
>
<TextView android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:id="@+id/tvPassWord"
android:text="密码:" />
<EditText android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:id="@+id/etPassWord"
android:minWidth="200dip"/>
</LinearLayout>
</RelativeLayout>

4、Dialog设计模式

  Dialog设计模式中有使用建造者模式,建造者模式将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
Android中AlertDialog是一个多面手,可以有着不同的样式和呈现,这样通过Builder就可以有效实现构建和表示的分离。
  AlertDialog.Builder就是具体建造者,另外,它是以匿名类的方式被创建的,而且,Builder类是AlertDialog的内部类,这样,
耦合性比较低,这正是面向对象中要达到的设计意图之一。 最后调用show函数,它的返回类型正是我们要创建的产品,即AlertDialog。
所以,Builder(具体建造者)是AlertDialog(产品)的内部匿名类,用来创建并显示一个dialog。

android学习日记27--Dialog使用及其设计模式的更多相关文章

  1. android学习日记03--常用控件Dialog

    常用控件 9.Dialog 我们经常会需要在Android界面上弹出一些对话框,比如询问用户或者让用户选择.这些功能我们叫它Android Dialog对话框 对话框,要创建对话框之前首先要创建Bui ...

  2. android学习日记03--常用控件checkbox/radiobutton

    常用控件3.checkbox 复选框,确定是否勾选,点击一下勾选,点击第二下取消,当有一系列备选项时适合用checkbox控件,方便用户提交数据. 贴上例子Activity的java代码 packag ...

  3. android学习日记03--常用控件button/imagebutton

    常用控件 控件是对数据和方法的封装.控件可以有自己的属性和方法.属性是控件数据的简单访问者.方法则是控件的一些简单而可见的功能.所有控件都是继承View类 介绍android原生提供几种常用的控件bu ...

  4. android学习日记05--Activity间的跳转Intent实现

    Activity间的跳转 Android中的Activity就是Android应用与用户的接口,所以了解Activity间的跳转还是必要的.在 Android 中,不同的 Activity 实例可能运 ...

  5. android学习日记28--Android中常用设计模式总结

    一.综述 设计模式,根据前人经验总结出常见软件工程问题的解决思想套路.GoF一共归纳了23种设计模式,当然还有人扩充,不止这些.设计模式主要利用面向对象语言的特性,而android 的设计主要用JAV ...

  6. android学习日记0--开发需要掌握的技能

    一.开发android,我们需要哪些技能基础 1.Java基础知识 2.Linux基础知识 3.数据库基础知识 4.网络协议 5.Android基础知识 6.服务器端开发知识 1.Java基础知识 很 ...

  7. android学习日记06--View视图

    一.android 界面开发 1.三个重要的类:View视图.Canvas画布.Paint画笔2.android 界面开发常用三种视图 View            --只能在主线程中更新,没有缓存 ...

  8. android学习日记02--Activity简介

    一.Activity活动 学习Android,第一个都会接触Activity滴,Activity表示一个用户界面,是Android应用程序的入口,可以同时有多个界面,但只会显示栈顶的界面. Activ ...

  9. 我的android学习经历27

    前几天忙着学校的互联网+项目比赛,没有时间学习android和发一些东西,主要是这两天太累了,我是项目组长,好多东西去弄,今天已经交稿去进行初赛. 马上收拾收拾心情,继续我的andorid菜鸟之路 加 ...

随机推荐

  1. 初探数位dp

    数位dp有着很明显的特点,一般来说是给定区间[l,r]求满足某种条件区间中的数有多少个 朴素解法一般是O(n)的而n往往很大(10^8起步) 这时候我们就要想办法优化,于是就有了数位dp 数位有两个基 ...

  2. [原]Unity3D深入浅出 - 天空盒(Skyboxes)

    Unity3D中自带了9中天空盒,在Assets - Import Package - Skyboxes 即可导入天空盒资源. 为Scene添加Skybox:在Edit菜单项里的Render Sett ...

  3. PHP如何大幅度提升运行效率? -- 把它编译成机器码!

      书接上回   今天讨论如何大幅度提升PHP的运行效率. 在这,我们不纠结神马单双引号.全局变量.OO.require_once.错误抑制.... 在这,我们也不讨论APC.opcache.XCac ...

  4. PostgreSql字符串函数和操作符

    本节描述了用于检查和操作字符串数值的函数和操作符.在这个环境中的字符串包括所有 character, character varying, text 类型的值.除非另外说明,所有下面列出的函数都可以处 ...

  5. asp.net微信公众平台开发

    http://mp.weixin.qq.com/wiki/index.php?title=%E6%B6%88%E6%81%AF%E6%8E%A5%E5%8F%A3%E6%8C%87%E5%8D%97 ...

  6. 结构型:代理模式 Vs 适配器模式 Vs 门面模式(外观模式)

    先上UML图 代理模式: 适配器模式: 门面模式(外观模式): 打了例子……呃……举个比方 代理模式: 水浒街,西门庆看上潘金莲,想和她嘿咻嘿咻,但是自己有不能去找潘金莲去说,于是他找到了金牌代理人王 ...

  7. Linux shell命令

    一.删除监听指定端口的进程: lsof -ti: 80 | xargs kill -9 -t: 输出pid -i:查看指定端口占用情况 二.查看可执行文件动态链接库相关信息 ldd <可执行文件 ...

  8. CSLA的项目结构(一)

    由于我也是边看边学,在很多概念不是很清晰的情况下,也不好将书中的大段内容全部摘抄过来,所以结合项目源码先分析再总结,就成目前比较可行方案,第一篇先从项目结构入手. 项目源码下载后,主要的功能集中在Co ...

  9. Android--应用开发3(Android layout XML属性)

    Android layout XML属性 转载:http://www.cnblogs.com/playing/archive/2011/04/07/2008620.html Layout对于迅速的搭建 ...

  10. leetcode@ [87] Scramble String (Dynamic Programming)

    Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty substrin ...