本文為作者原創,轉載請注明出處:http://www.cnblogs.com/gzdaijie/p/5222191.html
目錄
1.寫在前面
2.代碼示例
2.1 普通Dialog(圖1與圖2)
2.2 列表Dialog(圖3)
2.3 單選Dialog(圖4)
2.4 多選Dialog(圖5)
2.5 等待Dialog(圖6)
2.6 進度條Dialog(圖7)
2.7 編輯Dialog(圖8)
2.8 自定義Dialog(圖9)
3.復寫回調函數
1.寫在前面
- Android提供了豐富的
Dialog
函數,本文介紹最常用的8種對話框的使用方法,包括普通(包含提示消息和按鈕)、列表、單選、多選、等待、進度條、編輯、自定義等多種形式,將在第2部分介紹。 - 有時,我們希望在對話框創建或關閉時完成一些特定的功能,這需要
復寫
Dialog的create()
、show()
、dismiss()
等方法,將在第3部分介紹。
2.代碼示例
2.1 普通Dialog(圖1與圖2)
- 2個按鈕
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | public class MainActivity extends Activity { ???? @Override ???? protected void onCreate(Bundle savedInstanceState) { ???????? super .onCreate(savedInstanceState); ???????? setContentView(R.layout.activity_main); ???????? Button buttonNormal = (Button) findViewById(R.id.button_normal); ???????? buttonNormal.setOnClickListener( new View.OnClickListener() { ???????????? @Override ???????????? public void onClick(View v) { ???????????????? showNormalDialog(); ???????????? } ???????? }); ???? } ???? ????? private void showNormalDialog(){ ???????? /* @setIcon 設置對話框圖標 ????????? * @setTitle 設置對話框標題 ????????? * @setMessage 設置對話框消息提示 ????????? * setXXX方法返回Dialog對象,因此可以鏈式設置屬性 ????????? */ ???????? final AlertDialog.Builder normalDialog = ???????????? new AlertDialog.Builder(MainActivity. this ); ???????? normalDialog.setIcon(R.drawable.icon_dialog); ???????? normalDialog.setTitle( "我是一個普通Dialog" ) ???????? normalDialog.setMessage( "你要點擊哪一個按鈕呢?" ); ???????? normalDialog.setPositiveButton( "確定" , ???????????? new DialogInterface.OnClickListener() { ???????????? @Override ???????????? public void onClick(DialogInterface dialog, int which) { ???????????????? //...To-do ???????????? } ???????? }); ???????? normalDialog.setNegativeButton( "關閉" , ???????????? new DialogInterface.OnClickListener() { ???????????? @Override ???????????? public void onClick(DialogInterface dialog, int which) { ???????????????? //...To-do ???????????? } ???????? }); ???????? // 顯示 ???????? normalDialog.show(); ???? } } |
- 3個按鈕
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | /* @setNeutralButton 設置中間的按鈕 ? * 若只需一個按鈕,僅設置 setPositiveButton 即可 ? */ private void showMultiBtnDialog(){ ???? AlertDialog.Builder normalDialog = ???????? new AlertDialog.Builder(MainActivity. this ); ???? normalDialog.setIcon(R.drawable.icon_dialog); ???? normalDialog.setTitle( "我是一個普通Dialog" ).setMessage( "你要點擊哪一個按鈕呢?" ); ???? normalDialog.setPositiveButton( "按鈕1" , ???????? new DialogInterface.OnClickListener() { ???????? @Override ???????? public void onClick(DialogInterface dialog, int which) { ???????????? // ...To-do ???????? } ???? }); ???? normalDialog.setNeutralButton( "按鈕2" , ???????? new DialogInterface.OnClickListener() { ???????? @Override ???????? public void onClick(DialogInterface dialog, int which) { ???????????? // ...To-do ???????? } ???? }); ???? normalDialog.setNegativeButton( "按鈕3" , new DialogInterface.OnClickListener() { ???????? @Override ???????? public void onClick(DialogInterface dialog, int which) { ???????????? // ...To-do ???????? } ???? }); ???? // 創建實例并顯示 ???? normalDialog.show(); } |
2.2 列表Dialog(圖3)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | private void showListDialog() { ???? final String[] items = { "我是1" , "我是2" , "我是3" , "我是4" }; ???? AlertDialog.Builder listDialog = ???????? new AlertDialog.Builder(MainActivity. this ); ???? listDialog.setTitle( "我是一個列表Dialog" ); ???? listDialog.setItems(items, new DialogInterface.OnClickListener() { ???????? @Override ???????? public void onClick(DialogInterface dialog, int which) { ???????????? // which 下標從0開始 ???????????? // ...To-do ???????????? Toast.makeText(MainActivity. this , ???????????????? "你點擊了" + items[which], ???????????????? Toast.LENGTH_SHORT).show(); ???????? } ???? }); ???? listDialog.show(); } |
2.3 單選Dialog(圖4)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | int yourChoice; private void showSingleChoiceDialog(){ ???? final String[] items = { "我是1" , "我是2" , "我是3" , "我是4" }; ???? yourChoice = - 1 ; ???? AlertDialog.Builder singleChoiceDialog = ???????? new AlertDialog.Builder(MainActivity. this ); ???? singleChoiceDialog.setTitle( "我是一個單選Dialog" ); ???? // 第二個參數是默認選項,此處設置為0 ???? singleChoiceDialog.setSingleChoiceItems(items, 0 , ???????? new DialogInterface.OnClickListener() { ???????? @Override ???????? public void onClick(DialogInterface dialog, int which) { ???????????? yourChoice = which; ???????? } ???? }); ???? singleChoiceDialog.setPositiveButton( "確定" , ???????? new DialogInterface.OnClickListener() { ???????? @Override ???????? public void onClick(DialogInterface dialog, int which) { ???????????? if (yourChoice != - 1 ) { ???????????????? Toast.makeText(MainActivity. this , ???????????????? "你選擇了" + items[yourChoice], ???????????????? Toast.LENGTH_SHORT).show(); ???????????? } ???????? } ???? }); ???? singleChoiceDialog.show(); } |
2.4 多選Dialog(圖5)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | ArrayList<Integer> yourChoices = new ArrayList<>(); private void showMultiChoiceDialog() { ???? final String[] items = { "我是1" , "我是2" , "我是3" , "我是4" }; ???? // 設置默認選中的選項,全為false默認均未選中 ???? final boolean initChoiceSets[]={ false , false , false , false }; ???? yourChoices.clear(); ???? AlertDialog.Builder multiChoiceDialog = ???????? new AlertDialog.Builder(MainActivity. this ); ???? multiChoiceDialog.setTitle( "我是一個多選Dialog" ); ???? multiChoiceDialog.setMultiChoiceItems(items, initChoiceSets, ???????? new DialogInterface.OnMultiChoiceClickListener() { ???????? @Override ???????? public void onClick(DialogInterface dialog, int which, ???????????? boolean isChecked) { ???????????? if (isChecked) { ???????????????? yourChoices.add(which); ???????????? } else { ???????????????? yourChoices.remove(which); ???????????? } ???????? } ???? }); ???? multiChoiceDialog.setPositiveButton( "確定" , ???????? new DialogInterface.OnClickListener() { ???????? @Override ???????? public void onClick(DialogInterface dialog, int which) { ???????????? int size = yourChoices.size(); ???????????? String str = "" ; ???????????? for ( int i = 0 ; i < size; i++) { ???????????????? str += items[yourChoices.get(i)] + " " ; ???????????? } ???????????? Toast.makeText(MainActivity. this , ???????????????? "你選中了" + str, ???????????????? Toast.LENGTH_SHORT).show(); ???????? } ???? }); ???? multiChoiceDialog.show(); } |
2.5 等待Dialog(圖6)
1 2 3 4 5 6 7 8 9 10 11 12 13 | private void showWaitingDialog() { ???? /* 等待Dialog具有屏蔽其他控件的交互能力 ????? * @setCancelable 為使屏幕不可點擊,設置為不可取消(false) ????? * 下載等事件完成后,主動調用函數關閉該Dialog ????? */ ???? ProgressDialog waitingDialog= ???????? new ProgressDialog(MainActivity. this ); ???? waitingDialog.setTitle( "我是一個等待Dialog" ); ???? waitingDialog.setMessage( "等待中..." ); ???? waitingDialog.setIndeterminate( true ); ???? waitingDialog.setCancelable( false ); ???? waitingDialog.show(); } |
2.6 進度條Dialog(圖7)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | private void showProgressDialog() { ???? /* @setProgress 設置初始進度 ????? * @setProgressStyle 設置樣式(水平進度條) ????? * @setMax 設置進度最大值 ????? */ ???? final int MAX_PROGRESS = 100 ; ???? final ProgressDialog progressDialog = ???????? new ProgressDialog(MainActivity. this ); ???? progressDialog.setProgress( 0 ); ???? progressDialog.setTitle( "我是一個進度條Dialog" ); ???? progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); ???? progressDialog.setMax(MAX_PROGRESS); ???? progressDialog.show(); ???? /* 模擬進度增加的過程 ????? * 新開一個線程,每個100ms,進度增加1 ????? */ ???? new Thread( new Runnable() { ???????? @Override ???????? public void run() { ???????????? int progress= 0 ; ???????????? while (progress < MAX_PROGRESS){ ???????????????? try { ???????????????????? Thread.sleep( 100 ); ???????????????????? progress++; ???????????????????? progressDialog.setProgress(progress); ???????????????? } catch (InterruptedException e){ ???????????????????? e.printStackTrace(); ???????????????? } ???????????? } ???????????? // 進度達到最大值后,窗口消失 ???????????? progressDialog.cancel(); ???????? } ???? }).start(); } |
2.7 編輯Dialog(圖8)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | private void showInputDialog() { ???? /*@setView 裝入一個EditView ????? */ ???? final EditText editText = new EditText(MainActivity. this ); ???? AlertDialog.Builder inputDialog = ???????? new AlertDialog.Builder(MainActivity. this ); ???? inputDialog.setTitle( "我是一個輸入Dialog" ).setView(editText); ???? inputDialog.setPositiveButton( "確定" , ???????? new DialogInterface.OnClickListener() { ???????? @Override ???????? public void onClick(DialogInterface dialog, int which) { ???????????? Toast.makeText(MainActivity. this , ???????????? editText.getText().toString(), ???????????? Toast.LENGTH_SHORT).show(); ???????? } ???? }).show(); } |
2.8 自定義Dialog(圖9)
1 2 3 4 5 6 7 8 9 10 11 12 | <!-- res/layout/dialog_customize.xml--> <!-- 自定義View --> < LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" ???? android:orientation="vertical" ???? android:layout_width="match_parent" ???? android:layout_height="match_parent"> ???? < EditText ???????? android:id="@+id/edit_text" ???????? android:layout_width="match_parent" ???????? android:layout_height="wrap_content" ???????? /> </ LinearLayout > |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | private void showCustomizeDialog() { ???? /* @setView 裝入自定義View ==> R.layout.dialog_customize ????? * 由于dialog_customize.xml只放置了一個EditView,因此和圖8一樣 ????? * dialog_customize.xml可自定義更復雜的View ????? */ ???? AlertDialog.Builder customizeDialog = ???????? new AlertDialog.Builder(MainActivity. this ); ???? final View dialogView = LayoutInflater.from(MainActivity. this ) ???????? .inflate(R.layout.dialog_customize, null ); ???? customizeDialog.setTitle( "我是一個自定義Dialog" ); ???? customizeDialog.setView(dialogView); ???? customizeDialog.setPositiveButton( "確定" , ???????? new DialogInterface.OnClickListener() { ???????? @Override ???????? public void onClick(DialogInterface dialog, int which) { ???????????? // 獲取EditView中的輸入內容 ???????????? EditText edit_text = ???????????????? (EditText) dialogView.findViewById(R.id.edit_text); ???????????? Toast.makeText(MainActivity. this , ???????????????? edit_text.getText().toString(), ???????????????? Toast.LENGTH_SHORT).show(); ???????? } ???? }); ???? customizeDialog.show(); } |
3.復寫回調函數
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | /* 復寫Builder的create和show函數,可以在Dialog顯示前實現必要設置 ? * 例如初始化列表、默認選項等 ? * @create 第一次創建時調用 ? * @show 每次顯示時調用 ? */ private void showListDialog() { ???? final String[] items = { "我是1" , "我是2" , "我是3" , "我是4" }; ???? AlertDialog.Builder listDialog = ???????? new AlertDialog.Builder(MainActivity. this ){ ???????? ????????? @Override ???????? public AlertDialog create() { ???????????? items[ 0 ] = "我是No.1" ; ???????????? return super .create(); ???????? } ???????? @Override ???????? public AlertDialog show() { ???????????? items[ 1 ] = "我是No.2" ; ???????????? return super .show(); ???????? } ???? }; ???? listDialog.setTitle( "我是一個列表Dialog" ); ???? listDialog.setItems(items, new DialogInterface.OnClickListener() { ???????? @Override ???????? public void onClick(DialogInterface dialog, int which) { ???????????? // ...To-do ???????? } ???? }); ???? /* @setOnDismissListener Dialog銷毀時調用 ????? * @setOnCancelListener Dialog關閉時調用 ????? */ ???? listDialog.setOnDismissListener( new DialogInterface.OnDismissListener() { ???????? public void onDismiss(DialogInterface dialog) { ???????????? Toast.makeText(getApplicationContext(), ???????????????? "Dialog被銷毀了" , ???????????????? Toast.LENGTH_SHORT).show(); ???????? } ???? }); ???? listDialog.show(); } |