Android中经常会需要在Android界面上弹出一些对话框提示用户,比如App的退出的时候都会有各种框来挽留你的心,支付宝的时候输入密码的密码框,非常常见及其实用的功能,类似于JS中的alter,C#中C/S中常用MessgeBox,总而言之就是一个功能弹,弹,弹,本文就简单的叙述一下Dialog的各种弹框使用及监听,顺便写了一个简单的自定义弹框,接下来请看正文:
一般对话框
先看下整个App页面:
看下一般对话框的结果:
具体代码的实现,其中定义了两个按钮,一个是确定(PositiveButton)按钮,一个是取消(NegativeButton)按钮:
builder = new AlertDialog.Builder(this); builder.setTitle("亲,你真的要离开吗?"); // 相当于确定 builder.setPositiveButton("退出", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub Toast.makeText(MainActivity.this, "是的,哥要走了", Toast.LENGTH_SHORT).show(); } }); // 相当于取消 builder.setNegativeButton("再看看", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub Toast.makeText(MainActivity.this, "行,哥再看会", Toast.LENGTH_SHORT).show(); } }); builder.show();
ICON对话框
上面只是用到了两个按钮,其实还有一个是中立按钮,另外发现每次都写一个监听事件感觉太麻烦了,可以单独写一个监听事件去判断哪个事件被触发了:
单独定义个DialogClickListener:
private DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub switch (which) { case DialogInterface.BUTTON_POSITIVE: Toast.makeText(MainActivity.this, "强烈支持" + which, Toast.LENGTH_SHORT).show(); break; case DialogInterface.BUTTON_NEUTRAL: Toast.makeText(MainActivity.this, "跟我无关,我是中立的" + which, Toast.LENGTH_SHORT).show(); break; case DialogInterface.BUTTON_NEGATIVE: Toast.makeText(MainActivity.this, "强烈反对" + which, Toast.LENGTH_SHORT).show(); break; default: break; } } };
按钮事件的调用:
builder = new AlertDialog.Builder(this); builder.setTitle("XX视频"); builder.setIcon(android.R.drawable.btn_star); builder.setMessage("如何看待香港占中事件?"); builder.setPositiveButton("支持", dialogClickListener); builder.setNegativeButton("反对", dialogClickListener); // 中立 builder.setNeutralButton("中立", dialogClickListener); builder.show();
列表对话框
看下效果图:
代码实现:
builder = new AlertDialog.Builder(this); builder.setTitle("NBA幻觉"); builder.setIcon(android.R.drawable.btn_star); final String[] nameArrStrings = new String[] { "马刺很老", "小牛很弱", "火箭很强" }; builder.setItems(nameArrStrings, new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub Toast.makeText(MainActivity.this, nameArrStrings[which], Toast.LENGTH_SHORT).show(); } }); builder.setPositiveButton("确定", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub } }); builder.setNegativeButton("取消", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub } }); builder.show();
单选对话框
效果图:
代码实现:
builder = new AlertDialog.Builder(this); builder.setTitle("NBA球队"); builder.setIcon(android.R.drawable.btn_radio); final String[] ballArr = new String[] { "骑士", "热火", "凯尔特人" }; builder.setSingleChoiceItems(ballArr, 1, new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub Toast.makeText(MainActivity.this, ballArr[which], Toast.LENGTH_SHORT).show(); } }); builder.setPositiveButton("确定", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub } }); builder.setNegativeButton("取消", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub } }); builder.show();
多选对话框
效果图:
代码实现:
builder = new AlertDialog.Builder(this); builder.setTitle("NBA球星"); builder.setIcon(android.R.drawable.btn_radio); final String[] ballstartArr = new String[] { "邓肯", "诺维斯基", "莱昂纳德", "科比" }; final boolean[] multiCheckedArrStrings = new boolean[] { true, false, true, false }; builder.setMultiChoiceItems(ballstartArr, multiCheckedArrStrings, new OnMultiChoiceClickListener() { @Override public void onClick(DialogInterface dialog, int which, boolean isChecked) { // TODO Auto-generated method stub StringBuffer buffer = new StringBuffer(); for (int i = 0; i < multiCheckedArrStrings.length; i++) { if (multiCheckedArrStrings[i]) { buffer.append(ballstartArr[i] + ","); } } buffer.deleteCharAt(buffer.length() - 1); Toast.makeText(MainActivity.this, buffer, Toast.LENGTH_SHORT).show(); } }); builder.setPositiveButton("确定", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub } }); builder.show();
文本对话框
比如说支付宝,转账的时候你需要输入密码,弹出一个密码输入框,效果如图:
代码实现,,这个时候你需要给builder中的view赋值:
builder = new AlertDialog.Builder(this); builder.setTitle("输入密码"); builder.setIcon(android.R.drawable.btn_star); final EditText editText = new EditText(MainActivity.this); builder.setView(editText); builder.setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub Toast.makeText(MainActivity.this, "输入的密码是:" + editText.getText(), Toast.LENGTH_SHORT).show(); } }); builder.setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub Toast.makeText(MainActivity.this, "取消", Toast.LENGTH_SHORT).show(); } }); builder.show();
自定义对话框
上面的那个EditText是创建的,其实可以自定义一个布局,然后通过填充进去,效果如下:
自定义一个dialog_text.xml文件:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="密码:" /> <EditText android:id="@+id/edit_password" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout>
代码实现:
builder = new AlertDialog.Builder(this); builder.setTitle("输入密码"); builder.setIcon(android.R.drawable.btn_star); final EditText editText = new EditText(MainActivity.this); builder.setView(editText); builder.setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub Toast.makeText(MainActivity.this, "输入的密码是:" + editText.getText(), Toast.LENGTH_SHORT).show(); } }); builder.setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub Toast.makeText(MainActivity.this, "取消", Toast.LENGTH_SHORT).show(); } }); builder.show();
------------2015.11.15更新---忘记写了,还有一种是进度条对话框,简单的进度对话框和带进度的对话框-----
代码如下:
ProgressDialog progressDialog=new ProgressDialog(this); progressDialog.setTitle("XX助手"); progressDialog.setMessage("XX正在更新。。。"); progressDialog.show();
显示进度的对话框:
代码如下:
final ProgressDialog precentDialog=new ProgressDialog(this); precentDialog.setTitle("XX下载"); precentDialog.setMessage("XX正在更新。。。"); precentDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); precentDialog.setMax(100); precentDialog.show(); new Thread(){ public void run() { for (int i = 0; i < 100; i++) { try { Thread.sleep(50); } catch (InterruptedException e) { e.printStackTrace(); } precentDialog.setProgress(i); } precentDialog.dismiss(); }; }.start();