android学习日记27--Dialog使用及其设计模式
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使用及其设计模式的更多相关文章
- android学习日记03--常用控件Dialog
常用控件 9.Dialog 我们经常会需要在Android界面上弹出一些对话框,比如询问用户或者让用户选择.这些功能我们叫它Android Dialog对话框 对话框,要创建对话框之前首先要创建Bui ...
- android学习日记03--常用控件checkbox/radiobutton
常用控件3.checkbox 复选框,确定是否勾选,点击一下勾选,点击第二下取消,当有一系列备选项时适合用checkbox控件,方便用户提交数据. 贴上例子Activity的java代码 packag ...
- android学习日记03--常用控件button/imagebutton
常用控件 控件是对数据和方法的封装.控件可以有自己的属性和方法.属性是控件数据的简单访问者.方法则是控件的一些简单而可见的功能.所有控件都是继承View类 介绍android原生提供几种常用的控件bu ...
- android学习日记05--Activity间的跳转Intent实现
Activity间的跳转 Android中的Activity就是Android应用与用户的接口,所以了解Activity间的跳转还是必要的.在 Android 中,不同的 Activity 实例可能运 ...
- android学习日记28--Android中常用设计模式总结
一.综述 设计模式,根据前人经验总结出常见软件工程问题的解决思想套路.GoF一共归纳了23种设计模式,当然还有人扩充,不止这些.设计模式主要利用面向对象语言的特性,而android 的设计主要用JAV ...
- android学习日记0--开发需要掌握的技能
一.开发android,我们需要哪些技能基础 1.Java基础知识 2.Linux基础知识 3.数据库基础知识 4.网络协议 5.Android基础知识 6.服务器端开发知识 1.Java基础知识 很 ...
- android学习日记06--View视图
一.android 界面开发 1.三个重要的类:View视图.Canvas画布.Paint画笔2.android 界面开发常用三种视图 View --只能在主线程中更新,没有缓存 ...
- android学习日记02--Activity简介
一.Activity活动 学习Android,第一个都会接触Activity滴,Activity表示一个用户界面,是Android应用程序的入口,可以同时有多个界面,但只会显示栈顶的界面. Activ ...
- 我的android学习经历27
前几天忙着学校的互联网+项目比赛,没有时间学习android和发一些东西,主要是这两天太累了,我是项目组长,好多东西去弄,今天已经交稿去进行初赛. 马上收拾收拾心情,继续我的andorid菜鸟之路 加 ...
随机推荐
- 关于广义后缀树(多串SAM)的总结
之前我们给的SAM的例题,基本上是一个串建SAM的就能做的 如果要建多个串的SAM应该怎么做呢 首先看题,bzoj2780 我一开始的想法是SA以前的弄法,把串拼起来,中间加分隔符做SAM 这题确实可 ...
- CSS基础深入之细说盒子模型
Html任何一个元素(element)都可以当成一个盒子(box)来看待,可以结合现实中的盒子来理解下文,下文其中一些单词应该是通俗易懂的需要记录的单词. 基本情况 每一个盒子都有一个内容区域(con ...
- Android handler Thread 修改UI Demo
/********************************************************************** * Android handler Thread 修改U ...
- HDU 4635 Strongly connected(强连通分量,变形)
题意:给出一个有向图(不一定连通),问最多可添加多少条边而该图仍然没有强连通. 思路: 强连通分量必须先求出,每个强连通分量包含有几个点也需要知道,每个点只会属于1个强连通分量. 在使图不强连通的前提 ...
- 使用RMAN迁移文件系统数据库到ASM
--================================== -- 使用RMAN迁移文件系统数据库到ASM --================================== 在实际 ...
- Android LayoutInflater&LayoutInflaterCompat源码解析
本文分析版本: Android API 23,v4基于 23.2.1 1 简介 实例化布局的XML文件成相应的View对象.它不能被直接使用,应该使用getLayoutInflater()或getSy ...
- 自适应的CSS代码片段(常用)
/* Smartphones (portrait and landscape) ----------- */ @media only screen and (min-device-width : 32 ...
- NET下RabbitMQ实践[示例篇]
在上一篇文章中,介绍了在window环境下安装erlang,rabbitmq-server,以免配置用户,权限,虚拟机等内容. 今天将会介绍如果使用rabbitmq进行简单的消息入队, ...
- uboot环境变量与内核MTD分区关系
uboot 与系统内核中MTD分区的关系: 分区只是内核的概念,就是说A-B地址放内核,C-D地址放文件系统,(也就是规定哪个地址区间放内核或者文件系统)等等. 1:在内核MTD中可以定义分区A~B, ...
- Kettle定时执行(ETL工具)【转】
1,Kettle跨平台使用. 例如:在AIX下(AIX是IBM商用UNIX操作系统,此处在LINUX/UNIX同样适用),运行Kettle的相关步骤如下: 1)进入到Kettle部署的路径 ...