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. bzoj2818gcd

    原理很简单 题解我就不自己写了…… 做这题的时候,懂得了一个非常重要的转化:求(x, y) = k, 1 <= x, y <= n的对数等于求(x, y) = 1, 1 <= x, ...

  2. 触摸屏网站开发系列(一)-ios web App应用程序(ios meta)

    触摸屏网站的开发其实现在来讲比前几年移动端网站开发好多了,触摸屏设备IOS.Android.BBOS6等系统自带浏览器均为WEBKIT核心,这就说明PC上面尚未立行的HTML5 CSS3能够运用在这里 ...

  3. Google Maps API v2 Demo Tutorial

    申请API KEY https://code.google.com/apis/console/?noredirect 1. 创建项目,名称随意,只是为了区分 2. 开启Google Maps Andr ...

  4. SqlSugar轻量ORM

      蓝灯软件数据股份有限公司项目,代码开源. SqlSugar是一款轻量级的MSSQL ORM ,除了具有媲美ADO的性能外还具有和EF相似简单易用的语法. 学习列表 0.功能更新 1.SqlSuga ...

  5. java jvm学习笔记七(jar包的代码认证和签名)

    欢迎装载请说明出处:http://blog.csdn.net/yfqnihao 前言: 如果你循序渐进的看到这里,那么说明你的毅力提高了,jvm的很多东西都是比较抽像的,如果不找相对应的代码来辅助理解 ...

  6. android布局ui

    LinearLayout和RelativeLayout 属性对比 共有属性:java代码中通过btn1关联次控件android:id=”@+id/btn1″ 控件宽度android:layout_wi ...

  7. e2e 自动化集成测试 环境搭建 Node.js Selenium WebDriverIO Mocha Node-Inspector

    Node.js已经出来了许多年载,至今才开始接触.周未在家闲来无事,一时心血来潮,Google了大量的文章,经过实验,终于可以把整个环境给搭起来, 废话不多话,请看步骤. 特别注意, 本文章是针对Wi ...

  8. Java8 Stream API

    Stream是Java8中,操作集合的一个重要特性. 从iteration到Stream操作 当你操作一个集合的时候,你通常的做法是迭代每一个元素,然后处理你想要的事情.举个例子: String co ...

  9. 用COM方式快速导出到Excel一例,批量导出

    开发中用到填充Excel时,一个一个的填充不免太慢,现有用数组方式填充一例,可以实现COM方式快速填充. C#,VBA中用法类似 适用场景:需要自动化操作Excel的方式下使用,比较除填充数据外还要自 ...

  10. 基于寄存器的VM

    jvm是基于栈的,基于栈的原因是:实现简单,考虑的就是两个地方,局部变量和操作数栈 http://ifeve.com/javacode2bytecode/这几篇文章相当不错. http://redna ...