android 8种对话框(Dialog)汇总

<转>https://www.cnblogs.com/gzdaijie/p/5222191.html

1.代码示例

image.png

1.1普通Dialog

普通对话框
  • 两个按钮
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(); 
       } 
 } 
  • 三个按钮
//@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(); 
 } 

1.2列表Dialog

列表对话框
 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(); 
 } 

1.3单选Dialog

单选对话框
 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(); 
 } 

1.4多选Dialog

多选对话框
 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(); 
 } 

1.5等待Dialog

等待对话框
 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(); 
 } 

1.6进度条Dialog

进度条对话框
 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(); 
 } 

1.7编辑Dialog

编辑对话框
 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(); 
 } 

1.8自定义Dialog

自定义对话框
<!-- 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> 
 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(); 
 } 

2.复写回调函数

 /* 复写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(); 
 } 
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352