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();