1.确认取消对话框:
AlertDialog.Builder builder = new Builder(this); // 告诉工厂生产什么样的产品 builder.setTitle("友情提醒"); builder.setMessage("若练此功,必先自宫,是否继续?"); builder.setPositiveButton("好的,想好了", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Toast.makeText(MainActivity.this, "啊。。。", 0).show(); Toast.makeText(MainActivity.this, "及时自宫,也不一定成功", 0).show(); } }); builder.setNegativeButton("想想再说", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Toast.makeText(MainActivity.this, "若不自宫,一定不成功", 0).show(); } }); builder.create().show();
builder.create().show();
这里的只有工厂(AlertDialog.Builder)先创建create()出来AlertDialog然后我们才能show()出来;
这里我们看看create()方法的源码如下:
public AlertDialog create() { final AlertDialog dialog = new AlertDialog(P.mContext, mTheme, false); P.apply(dialog.mAlert); dialog.setCancelable(P.mCancelable); if (P.mCancelable) { dialog.setCanceledOnTouchOutside(true); } dialog.setOnCancelListener(P.mOnCancelListener); if (P.mOnKeyListener != null) { dialog.setOnKeyListener(P.mOnKeyListener); } return dialog; }
返回一个AlertDialog,然后我们再看看show()的源码如下:
public AlertDialog show() { AlertDialog dialog = create(); dialog.show(); return dialog; }
我们发现这里show()中其实也先实现了create(),,所以上面的:
builder.create().show();其实可以改写成:builder.show();
运行的效果如下:
2.单选对话框
// 工厂模式。 AlertDialog.Builder builder = new Builder(this); // 告诉工厂生产什么样的产品 builder.setTitle("请选择性别:"); final String[] items = { "男", "女", "未知" }; builder.setSingleChoiceItems(items, 2, new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss();// 关闭对话框 Toast.makeText(MainActivity.this, "您的性别:" + items[which], 0) .show(); } }); builder.show();
setSingleChoiceItems(CharSequence[] items, int checkedItem, final OnClickListener listener)方法来实现类似RadioButton的AlertDialog
第一个参数是要显示的数据的数组;
第二个参数是初始值(初始被选中的item);
第三个参数是点击某个item的触发事件;
这里OnClickListener里面方法public void onClick(DialogInterface dialog, int which):
第一个参数:用来系统确定对话框(程序中出现多个对话框的时候,系统靠的就是这个参数DialogInterface dialog来确定我们点击的对话框);
第二个参数:用来系统确定我们点击选择的对话框中的子项目;
运行的效果如下:
3. 多选对话框
// 工厂模式。 AlertDialog.Builder builder = new Builder(this); // 告诉工厂生产什么样的产品 builder.setTitle("请选择您喜欢的水果:"); final String[] items = { "苹果", "香蕉", "葡萄", "橘子" }; final boolean[] result = new boolean[] { true, true, false, false }; builder.setMultiChoiceItems(items, result, new OnMultiChoiceClickListener() { @Override public void onClick(DialogInterface dialog, int which, boolean isChecked) { result[which] = isChecked; Toast.makeText(MainActivity.this, items[which] + isChecked, 0).show(); } }); builder.setPositiveButton("提交", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { StringBuffer sb = new StringBuffer(); for (int i = 0; i < result.length; i++) { if (result[i]) { sb.append(items[i] + ","); } } Toast.makeText(MainActivity.this, "您喜欢:" + sb.toString(), 0) .show(); } }); builder.show();
public Builder setMultiChoiceItems(CharSequence[] items, boolean[] checkedItems, final OnMultiChoiceClickListener listener)
第一个参数:指定我们要显示的一组下拉多选框的数据集合
第二个参数:代表哪几个选项被选择,如果是null,则表示一个都不选择,如果希望指定哪一个多选选项框被选择,
需要传递一个boolean[]数组进去,其长度要和第一个参数的长度相同,例如 {true, false, false, true};
第三个参数:给每一个多选项绑定一个监听器
这里的监听器OnMultiChoiceClickListener 中的方法: public void onClick(DialogInterface dialog, int which,boolean isChecked)
第一个参数:用来确定此处工厂模式创建的对话框;
第二个参数:用来确定对话框中我们点击的子项;
第三个参数:用来判别对话框的子项的点击状态(true:表示子项选择;false:表示子项没有被选择)
运行效果:
4.进度对话框
(1)圆形进度条
final ProgressDialog pd = new ProgressDialog(this); pd.setTitle("提醒"); pd.setMessage("正在处理中。。。请稍后"); pd.show(); new Thread() { public void run() { try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } pd.dismiss(); }; }.start();
运行效果:
(2)水平进度条
final ProgressDialog pd = new ProgressDialog(this); // 设置进度的样式 pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); pd.setTitle("提醒"); pd.setMessage("正在处理中。。。请稍后"); pd.show(); new Thread() { public void run() { pd.setMax(100); try { for (int i = 0; i <= 100; i++) { pd.setProgress(i); Thread.sleep(500); } } catch (InterruptedException e) { e.printStackTrace(); } pd.dismiss(); }; }.start();
运行结果:
5.上面代码都是我案例一部分代码,附上的案例程序如下:
(1)activity_main.xml:
<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" android:orientation="vertical" tools:context=".MainActivity" > <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="click01" android:text="确定取消对话框" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="click02" android:text="单选对话框" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="click03" android:text="多选对话框" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="click04" android:text="进度对话框" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="click05" android:text="进度对话框" /> </LinearLayout>
布局效果:
(2)接下来就是:MainAcitivity.java:
1 package com.itheima.dialogset; 2 3 import android.app.Activity; 4 import android.app.AlertDialog; 5 import android.app.AlertDialog.Builder; 6 import android.app.ProgressDialog; 7 import android.content.DialogInterface; 8 import android.content.DialogInterface.OnClickListener; 9 import android.content.DialogInterface.OnMultiChoiceClickListener; 10 import android.os.Bundle; 11 import android.view.View; 12 import android.widget.Toast; 13 14 public class MainActivity extends Activity { 15 16 @Override 17 protected void onCreate(Bundle savedInstanceState) { 18 super.onCreate(savedInstanceState); 19 setContentView(R.layout.activity_main); 20 } 21 22 /** 23 * 确定取消对话框 24 * 25 * @param view 26 */ 27 public void click01(View view) { 28 // 工厂模式。 29 AlertDialog.Builder builder = new Builder(this); 30 // 告诉工厂生产什么样的产品 31 builder.setTitle("友情提醒"); 32 builder.setMessage("若练此功,必先自宫,是否继续?"); 33 builder.setPositiveButton("好的,想好了", new OnClickListener() { 34 @Override 35 public void onClick(DialogInterface dialog, int which) { 36 Toast.makeText(MainActivity.this, "啊。。。", 0).show(); 37 Toast.makeText(MainActivity.this, "及时自宫,也不一定成功", 0).show(); 38 } 39 }); 40 builder.setNegativeButton("想想再说", new OnClickListener() { 41 42 @Override 43 public void onClick(DialogInterface dialog, int which) { 44 Toast.makeText(MainActivity.this, "若不自宫,一定不成功", 0).show(); 45 } 46 }); 47 builder.show(); 48 } 49 50 /** 51 * 单选对话框 52 * 53 * @param view 54 */ 55 public void click02(View view) { 56 // 工厂模式。 57 AlertDialog.Builder builder = new Builder(this); 58 // 告诉工厂生产什么样的产品 59 builder.setTitle("请选择性别:"); 60 final String[] items = { "男", "女", "未知" }; 61 builder.setSingleChoiceItems(items, 2, new OnClickListener() { 62 @Override 63 public void onClick(DialogInterface dialog, int which) { 64 dialog.dismiss();// 关闭对话框 65 Toast.makeText(MainActivity.this, "您的性别:" + items[which], 0) 66 .show(); 67 } 68 }); 69 builder.show(); 70 } 71 72 /** 73 * 多选对话框 74 * 75 * @param view 76 */ 77 public void click03(View view) { 78 // 工厂模式。 79 AlertDialog.Builder builder = new Builder(this); 80 // 告诉工厂生产什么样的产品 81 builder.setTitle("请选择您喜欢的水果:"); 82 final String[] items = { "苹果", "香蕉", "葡萄", "橘子" }; 83 final boolean[] result = new boolean[] { true, true, false, false }; 84 builder.setMultiChoiceItems(items, result, 85 new OnMultiChoiceClickListener() { 86 @Override 87 public void onClick(DialogInterface dialog, int which, 88 boolean isChecked) { 89 result[which] = isChecked; 90 Toast.makeText(MainActivity.this, 91 items[which] + isChecked, 0).show(); 92 } 93 }); 94 builder.setPositiveButton("提交", new DialogInterface.OnClickListener() { 95 @Override 96 public void onClick(DialogInterface dialog, int which) { 97 StringBuffer sb = new StringBuffer(); 98 for (int i = 0; i < result.length; i++) { 99 if (result[i]) { 100 sb.append(items[i] + ","); 101 } 102 } 103 Toast.makeText(MainActivity.this, "您喜欢:" + sb.toString(), 0) 104 .show(); 105 } 106 }); 107 builder.show(); 108 } 109 110 /** 111 * 进度对话框 112 * 113 * @param view 114 */ 115 public void click04(View view) { 116 final ProgressDialog pd = new ProgressDialog(this); 117 pd.setTitle("提醒"); 118 pd.setMessage("正在处理中。。。请稍后"); 119 pd.show(); 120 new Thread() { 121 public void run() { 122 try { 123 Thread.sleep(5000); 124 } catch (InterruptedException e) { 125 e.printStackTrace(); 126 } 127 pd.dismiss(); 128 }; 129 }.start(); 130 } 131 132 /** 133 * 进度条对话框 134 * 135 * @param view 136 */ 137 public void click05(View view) { 138 final ProgressDialog pd = new ProgressDialog(this); 139 // 设置进度的样式 140 pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 141 pd.setTitle("提醒"); 142 pd.setMessage("正在处理中。。。请稍后"); 143 pd.show(); 144 new Thread() { 145 public void run() { 146 pd.setMax(100); 147 try { 148 for (int i = 0; i <= 100; i++) { 149 pd.setProgress(i); 150 Thread.sleep(500); 151 } 152 } catch (InterruptedException e) { 153 e.printStackTrace(); 154 } 155 pd.dismiss(); 156 }; 157 }.start(); 158 } 159 160 }