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
按钮就不一一点进去演示,直接看源码:
1 /**多个按钮信息框 **/ 2 private static final int DIALOG_1 = 2; 3 /**列表框 **/ 4 private static final int DIALOG_2 = 3; 5 /**进度条框 **/ 6 private static final int DIALOG_3 = 4; 7 /**单项选择列表框 **/ 8 private static final int DIALOG_4 = 5; 9 /**多项选择列表框 **/ 10 private static final int DIALOG_5 = 6; 11 /**自定义布局 **/ 12 private static final int DIALOG_6 = 7; 13 /**读取进度框 **/ 14 private static final int DIALOG_7 = 8; 15 /**自定义布局 **/ 16 private static final int DIALOG_8 = 9; 17 /**读取进度框 **/ 18 private static final int DIALOG_9 = 10; 19 20 private ProgressDialog pDialog; 21 private DatePickerDialog dDialog; 22 private TimePickerDialog tDialog; 23 private Calendar c; 24 final String[] items = {"item0","item1","itme2","item3","itme4"}; 25 ArrayList <Integer>MultiChoiceID = new ArrayList <Integer>(); 26 27 @Override 28 protected void onCreate(Bundle savedInstanceState) { 29 super.onCreate(savedInstanceState); 30 setContentView(R.layout.activity_main); 31 32 Button button1 = (Button) findViewById(R.id.button1); 33 button1.setOnClickListener(new OnClickListener() { 34 public void onClick(View v) { 35 CreatDialog(DIALOG_1); 36 } 37 }); 38 39 Button button2 = (Button) findViewById(R.id.button2); 40 button2.setOnClickListener(new OnClickListener() { 41 public void onClick(View v) { 42 CreatDialog(DIALOG_2); 43 } 44 }); 45 46 Button button3 = (Button) findViewById(R.id.button3); 47 button3.setOnClickListener(new OnClickListener() { 48 public void onClick(View v) { 49 CreatDialog(DIALOG_3); 50 //mProgressDialog.setProgress(0); 51 } 52 }); 53 54 Button button4 = (Button) findViewById(R.id.button4); 55 button4.setOnClickListener(new OnClickListener() { 56 public void onClick(View v) { 57 CreatDialog(DIALOG_4); 58 } 59 }); 60 61 Button button5 = (Button) findViewById(R.id.button5); 62 button5.setOnClickListener(new OnClickListener() { 63 public void onClick(View v) { 64 CreatDialog(DIALOG_5); 65 } 66 }); 67 68 Button button6 = (Button) findViewById(R.id.button6); 69 button6.setOnClickListener(new OnClickListener() { 70 public void onClick(View v) { 71 CreatDialog(DIALOG_6); 72 } 73 }); 74 75 Button button7 = (Button) findViewById(R.id.button7); 76 button7.setOnClickListener(new OnClickListener() { 77 public void onClick(View v) { 78 CreatDialog(DIALOG_7); 79 } 80 }); 81 Button button8 = (Button) findViewById(R.id.button8); 82 button8.setOnClickListener(new OnClickListener() { 83 public void onClick(View v) { 84 CreatDialog(DIALOG_8); 85 } 86 }); 87 88 Button button9 = (Button) findViewById(R.id.button9); 89 button9.setOnClickListener(new OnClickListener() { 90 public void onClick(View v) { 91 CreatDialog(DIALOG_9); 92 } 93 }); 94 } 95 96 public void CreatDialog(int id) { 97 AlertDialog.Builder builder = new Builder(DialogDemoActivity.this); 98 switch (id) { 99 case DIALOG_1: 100 builder.setIcon(R.drawable.ic_launcher); 101 builder.setTitle("投票"); 102 builder.setMessage("您认为什么样的内容吸引你?"); 103 builder.setPositiveButton("有趣的", new DialogInterface.OnClickListener() { 104 105 @Override 106 public void onClick(DialogInterface dialog, int which) { 107 // TODO Auto-generated method stub 108 showDialog("您选择了有趣的!"); 109 } 110 111 }); 112 builder.setNeutralButton("有内涵的", new DialogInterface.OnClickListener() { 113 114 @Override 115 public void onClick(DialogInterface dialog, int which) { 116 // TODO Auto-generated method stub 117 showDialog("您选择了有内涵的!"); 118 } 119 120 }); 121 builder.setNegativeButton("其他", new DialogInterface.OnClickListener() { 122 123 @Override 124 public void onClick(DialogInterface dialog, int which) { 125 // TODO Auto-generated method stub 126 showDialog("您选择了其他!"); 127 } 128 129 }); 130 break; 131 case DIALOG_2: 132 builder.setTitle("列表框"); 133 134 builder.setItems(items, new DialogInterface.OnClickListener() { 135 136 @Override 137 public void onClick(DialogInterface dialog, int which) { 138 // TODO Auto-generated method stub 139 showDialog("您选择了"+items[which]); 140 } 141 142 }); 143 break; 144 case DIALOG_3: 145 pDialog = new ProgressDialog(DialogDemoActivity.this); 146 pDialog.setIcon(R.drawable.ic_launcher); 147 pDialog.setTitle("带进度条的"); 148 pDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 149 pDialog.setMax(100); 150 pDialog.setButton("ok", new DialogInterface.OnClickListener() { 151 152 @Override 153 public void onClick(DialogInterface dialog, int which) { 154 // TODO Auto-generated method stub 155 156 } 157 }); 158 pDialog.setButton2("cancle", new DialogInterface.OnClickListener() { 159 160 @Override 161 public void onClick(DialogInterface dialog, int which) { 162 // TODO Auto-generated method stub 163 164 } 165 }); 166 pDialog.show(); 167 new Thread(this).start(); 168 return; 169 case DIALOG_4: 170 builder.setTitle("单列表选择框"); 171 172 builder.setSingleChoiceItems(items, 0, new DialogInterface.OnClickListener() { 173 174 @Override 175 public void onClick(DialogInterface dialog, int which) { 176 // TODO Auto-generated method stub 177 showDialog("你选择的id为" + which + " , " + items[which]); 178 } 179 }); 180 break; 181 case DIALOG_5: 182 MultiChoiceID.clear(); 183 builder.setTitle("多列表选择框"); 184 185 builder.setMultiChoiceItems(items 186 , new boolean[]{false,false,false,false,false} 187 ,new DialogInterface.OnMultiChoiceClickListener() { 188 public void onClick(DialogInterface dialog, int whichButton, 189 boolean isChecked) { 190 if(isChecked) { 191 MultiChoiceID.add(whichButton); 192 showDialog("你选择的id为" + whichButton + " , " + items[whichButton]); 193 }else { 194 MultiChoiceID.remove(whichButton); 195 } 196 197 } 198 }); 199 builder.setPositiveButton("确定", new DialogInterface.OnClickListener() { 200 public void onClick(DialogInterface dialog, int whichButton) { 201 String str = ""; 202 int size = MultiChoiceID.size(); 203 for (int i = 0 ;i < size; i++) { 204 str+= items[MultiChoiceID.get(i)] + ", "; 205 } 206 showDialog("你选择的是" + str); 207 } 208 }); 209 builder.setNegativeButton("取消", new DialogInterface.OnClickListener() { 210 public void onClick(DialogInterface dialog, int whichButton) { 211 212 } 213 }); 214 break; 215 case DIALOG_6: 216 217 builder.setTitle("自定义对话框"); 218 LayoutInflater layoutInflater = LayoutInflater.from(this); 219 final View layout = layoutInflater.inflate(R.layout.test, null); 220 221 builder.setView(layout); 222 223 builder.setPositiveButton("确定", new DialogInterface.OnClickListener() { 224 public void onClick(DialogInterface dialog, int whichButton) { 225 EditText userName = (EditText) layout.findViewById(R.id.etUserName); 226 EditText password = (EditText) layout.findViewById(R.id.etPassWord); 227 showDialog("姓名 :" + userName.getText().toString() + "密码:" + password.getText().toString() ); 228 } 229 }); 230 builder.setNegativeButton("取消", new DialogInterface.OnClickListener() { 231 public void onClick(DialogInterface dialog, int whichButton) { 232 233 } 234 }); 235 break; 236 case DIALOG_7: 237 pDialog = new ProgressDialog(DialogDemoActivity.this); 238 pDialog.setIcon(R.drawable.ic_launcher); 239 pDialog.setTitle("循环进度"); 240 pDialog.setMessage("正在读取"); 241 pDialog.setIndeterminate(true); // 设置进度条不明确,即一直在滚动,不清楚进度 242 pDialog.setCancelable(true); // 设置 返回键 是否取消 进度框 243 pDialog.show(); 244 return; 245 case DIALOG_8: 246 c= Calendar.getInstance(); 247 dDialog = new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() { 248 249 @Override 250 public void onDateSet(DatePicker view, int year, int monthOfYear, 251 int dayOfMonth) { 252 // TODO Auto-generated method stub 253 254 } 255 }, c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DAY_OF_MONTH)); 256 dDialog.show(); 257 return; 258 case DIALOG_9: 259 c= Calendar.getInstance(); 260 tDialog = new TimePickerDialog( //创建TimePickerDialog对象 261 this, 262 new TimePickerDialog.OnTimeSetListener(){ //创建OnTimeSetListener监听器 263 @Override 264 public void onTimeSet(TimePicker tp, int hourOfDay, int minute) { 265 } 266 }, 267 c.get(Calendar.HOUR_OF_DAY), //传入当前小时数 268 c.get(Calendar.MINUTE), //传入当前分钟数 269 false 270 ); 271 tDialog.show(); 272 return; 273 } 274 275 builder.create().show(); 276 277 } 278 279 private void showDialog(String str) { 280 new AlertDialog.Builder(DialogDemoActivity.this) 281 .setMessage(str) 282 .show(); 283 } 284 285 @Override 286 public void run() { 287 int Progress = 0; 288 while(Progress < 100) { 289 try { 290 Thread.sleep(100); 291 Progress++; 292 pDialog.incrementProgressBy(1); 293 } catch (InterruptedException e) { 294 // TODO Auto-generated catch block 295 e.printStackTrace(); 296 } 297 } 298 299 }
其中自定义Dialog的布局文件test.xml
1 <?xml version="1.0" encoding="utf-8"?> 2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_height="wrap_content" 4 android:layout_width="wrap_content" 5 android:orientation="horizontal" 6 android:id="@+id/dialog"> 7 <LinearLayout 8 android:layout_height="wrap_content" 9 android:layout_width="wrap_content" 10 android:orientation="horizontal" 11 android:id="@+id/dialogname"> 12 13 <TextView android:layout_height="wrap_content" 14 android:layout_width="wrap_content" 15 android:id="@+id/tvUserName" 16 android:text="姓名:" /> 17 <EditText android:layout_height="wrap_content" 18 android:layout_width="wrap_content" 19 android:id="@+id/etUserName" 20 android:minWidth="200dip"/> 21 </LinearLayout> 22 <LinearLayout 23 android:layout_height="wrap_content" 24 android:layout_width="wrap_content" 25 android:orientation="horizontal" 26 android:id="@+id/dialognum" 27 android:layout_below="@+id/dialogname" 28 > 29 <TextView android:layout_height="wrap_content" 30 android:layout_width="wrap_content" 31 android:id="@+id/tvPassWord" 32 android:text="密码:" /> 33 <EditText android:layout_height="wrap_content" 34 android:layout_width="wrap_content" 35 android:id="@+id/etPassWord" 36 android:minWidth="200dip"/> 37 </LinearLayout> 38 </RelativeLayout>
4、Dialog设计模式
Dialog设计模式中有使用建造者模式,建造者模式将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
Android中AlertDialog是一个多面手,可以有着不同的样式和呈现,这样通过Builder就可以有效实现构建和表示的分离。
AlertDialog.Builder就是具体建造者,另外,它是以匿名类的方式被创建的,而且,Builder类是AlertDialog的内部类,这样,
耦合性比较低,这正是面向对象中要达到的设计意图之一。 最后调用show函数,它的返回类型正是我们要创建的产品,即AlertDialog。
所以,Builder(具体建造者)是AlertDialog(产品)的内部匿名类,用来创建并显示一个dialog。