android Dialog

Android--Dialog詳細講解
轉自:http://www.kwstu.com/ArticleView/kwstu_20139682354515 

前言html

  對話框對於應用也是必不可少的一個組件,在Android中也不例外,對話框對於一些提示重要信息,或者一些須要用戶額外交互的一些內容頗有幫 助。本篇博客就講解一下Android下對話框的使用,在本篇博客中,將瞭解到對話框的一些常規屬性的設置,以及各式的對話框的使用,並都會提供小 Demo來展現全部的效果。java

Dialogandroid

  Dialog,對話框,一個對話框就是一個小窗口,並不會填滿整個屏幕,一般是以模態顯示,要求用戶必須採起行動才能繼續進行剩下的操做。數組

  Android提供了豐富的對話框支持,它提供了以下4中經常使用的對話框:app

  • AlertDialog:警告對話框,使用最普遍功能最豐富的一個對話框。
  • ProgressDialog:進度條對話框,只是對進度條進行了簡單的封裝。
  • DatePickerDialog:日期對話框。
  • TimePickerDialog:時間對話框。

  全部的對話框,都是直接或間接繼承自Dialog類,而AlterDialog直接繼承自Dialog,其餘的幾個類均繼承自AlterDialog。ide

 

AlertDialog函數

  AlertDialog繼承自Dialog類,對於Android內置的AlterDialog,它能夠包含一個標題、一個內容消息或者一個選擇列表、最多三個按鈕。而建立AlterDialog推薦使用它的一個內部類AlterDialog.Builder創 建。使用Builder對象,能夠設置AlterDialog的各類屬性,最後經過Builder.create()就能夠獲得AlterDialog對 象,若是隻是還須要顯示這個AlterDialog,通常能夠直接使用Builder.show()方法,它會返回一個AlterDialog對象,而且 顯示它。佈局

  若是僅僅是須要提示一段信息給用戶,那麼就能夠直接使用AlterDialog的一些屬性設置提示信息,涉及到的方法有:ui

  • AlterDialog create():根據設置的屬性,建立一個AlterDialog。
  • AlterDialog show():根據設置的屬性,建立一個AlterDialog,而且顯示在屏幕上。
  • AlterDialog.Builder setTitle():設置標題。
  • AlterDialog.Builder setIcon():設置標題的圖標。
  • AlterDialog.Builder setMessage():設置標題的內容。
  • AlterDialog.Builder setCancelable():設置是否模態,通常設置爲false,表示模態,要求用戶必須採起行動才能繼續進行剩下的操做。

  Tips:AlterDialog.Builder的不少設置屬性的方法,返回的均是這個AlterDialog.Builder對象,因此可使用鏈式方式編寫代碼,這樣更方便。this

  當一個對話框調用了show()方法後,展現到屏幕上,若是須要消除它,可使用DialogInterface接口聲明的兩個方 法,cancel()和dismiss()使對話框取或者消除,這兩個方法的做用是同樣的,不過推薦使用dismiss()。Dialog和 AlterDialog都實現了DialogInterface接口,因此只要是對話框,都可以使用這兩個方法來消除對話框。

  下面經過一個簡單的Demo,先看看AlterDialog是如何提示信息的:

  示例:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
btnGeneral.setOnClickListener( new  View.OnClickListener() {
  
              @Override
              public  void  onClick(View v) {
                  // TODO Auto-generated method stub
                  AlertDialog.Builder builder = new  AlertDialog.Builder(
                          MainActivity. this );
                 builder.setTitle( "提示" );
                  builder.setMessage( "這是一個普通的對話框!" );
                  builder.setIcon(R.drawable.ic_launcher);
                  builder.setCancelable( false );
                 builder.setPositiveButton( "知道了!" , new  OnClickListener() {
                      @Override
                      public  void  onClick(DialogInterface dialog, int  which) {
                          dialog.cancel();
                      }
                 });
                 builder.create().show();
              }
          });

 

展現效果:

 

AlterDialog的按鈕

  AlterDialog內置了三個按鈕,能夠直接使用setXxxButton()方法進行設置,對於通常的對話框,使用三個按鈕基本上也夠用了,下面是這三個方法的簽名:

  • AlterDialog.Builder setPositiveButton(CharSquence text , DialogInterFace.OnClickListener):一個積極的按鈕,通常用於「OK」或者「繼續」等操做。
  • AlterDialog.Builder setNegativeButton(CharSquence text , DialogInterFace.OnClickListener):一個負面的按鈕,通常用於「取消」操做。
  • AlterDialog.Builder setNeutralButton(CharSquence text , DialogInterFace.OnClickListener):一個比較中性的按鈕,通常用於「忽略」、「之後提醒我」等操做。

  上面介紹的DialogInterface接口,還提供了一系列的事件響應,這三個按鈕均須要傳遞一個 DialogInterFace.OnClickListener接口對象,實現其點擊事件的觸發,在這個接口中須要實現一個 onClick(DialogInterface dialog,int which),dialog爲當前觸發事件的對話框對象接口,能夠直接強制轉換爲AlterDialog進行操做;which爲點擊按鈕的標識符,是一個 整形的數據,對於這三個按鈕而言,每一個按鈕使用不一樣的int類型數據進行標識:Positive(-1)、Negative(-2)、 Neutral(-3)。

  而除了專門爲按鈕點擊實現的DialogInterFace.OnClickListener事件外,DialogInterface還提供了 一些其餘的事件,供Dialog對象響應,這些事件只是對Dialog聲明週期各個狀態的響應,一看就明白了,就再也不詳細講解了,下面是這幾個事件的說 明:

  • interface DialogInterface.OnCancelListener:當對話框調用cancel()方法的時候觸發。
  • interface DialogInterface.OnDismissListener:當對話框調用dismiss()方法的時候觸發。
  • interface DialogInterface.OnShowListener:當對話框調用show()方法的時候觸發。
  • interface DialogInterface.OnMultiChoiceListener:當對話框使用多選列表,而且選中的時候觸發。

  示例:

?
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
btnButtons.setOnClickListener( new  View.OnClickListener() {
 
              @Override
             public  void  onClick(View v) {
                  // TODO Auto-generated method stub
                  AlertDialog.Builder builder = new  AlertDialog.Builder(
                         MainActivity. this );
                  builder.setTitle( "提示" );
                  builder.setMessage( "這是一個多按鈕普通的對話框!" );
                 builder.setIcon(R.drawable.ic_launcher);
                 builder.setPositiveButton( "肯定" , new  OnClickListener() {
  
                      @Override
                      public  void  onClick(DialogInterface dialog, int  which) {                       
                          Toast.makeText(MainActivity. this , "肯定被點擊" ,
                                 Toast.LENGTH_SHORT).show();
                          dialog.dismiss();
                      }
                  });
                  builder.setNegativeButton( "否認" , new  OnClickListener() {
  
                      @Override
                     public  void  onClick(DialogInterface dialog, int  which) {
                          // TODO Auto-generated method stub
                          Toast.makeText(MainActivity. this , "否認被點擊" ,
                                 Toast.LENGTH_SHORT).show();
                         dialog.dismiss();
                    }
                  });
                  builder.setNeutralButton( "忽略" , new  OnClickListener() {
 
                      @Override
                      public  void  onClick(DialogInterface dialog, int  which) {
                          // TODO Auto-generated method stub
                          Toast.makeText(MainActivity. this , "忽略被點擊" ,
                                 Toast.LENGTH_SHORT).show();
                          dialog.cancel();
                      }
                  });
                  builder.show();
              }
          });

 

  展現效果:

 

AlterDialog的列表形式

  AlterDialog除了展現一些提示信息,還能夠展現一種列表的形式,須要使用到 Builder.setItems(CharSequence[] items,DialogInterface.OnClickListener listener)方法進行設置,它須要傳遞一個CharSequenece類型的數組,以綁定列表的數據,它一樣須要傳遞一個 DialogInterface.OnClickListener接口,以響應列表項的點擊,而這個接口中onClick方法的which參數,爲當前點 擊觸發項的items中的下標。

  示例:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
btnListView.setOnClickListener( new  View.OnClickListener() {
 
     @Override
     public  void  onClick(View v) {
         // TODO Auto-generated method stub
        AlertDialog.Builder builder = new  AlertDialog.Builder(
                MainActivity. this );
         builder.setTitle( "請選擇城市" );
         //items使用全局的finalCharSequenece數組聲明
         builder.setItems(items, new  OnClickListener() {
             @Override
             public  void  onClick(DialogInterface dialog, int  which) {
                 // TODO Auto-generated method stub
                 String select_item = items[which].toString();
                 Toast.makeText(MainActivity. this ,
                         "選擇了---》"  + select_item, Toast.LENGTH_SHORT)
                         .show();
             }
         });
         builder.show();
     }
});
  效果展現: 

 

 AlterDialog的單選列表

  AlterDialog還可使用一種單選的列表樣式,使用 Builder.setSingleChoiceItems(CharSequenece[] items,int checkedItem,DialogInterface.OnClickListener listener),這個方法具備多項重載,主要是爲了應對不一樣的數據源,items爲列表項數組,checkedItem爲初始選項,listener 爲點擊響應事件。有時候並不必定須要選中以後就關閉對話框,能夠設置兩個按鈕,用於肯定選擇。

  示例:

?
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
btnListViewSingle.setOnClickListener( new  View.OnClickListener() {
             @Override
             public  void  onClick(View v) {
                 // TODO Auto-generated method stub
                 AlertDialog.Builder builder = new  AlertDialog.Builder(
                         MainActivity. this );
                 builder.setTitle( "請選擇一下城市" );
                 builder.setSingleChoiceItems(items, 1 , new  OnClickListener() {
 
                     @Override
                     public  void  onClick(DialogInterface dialog, int  which) {
                         // TODO Auto-generated method stub
                        String select_item = items[which].toString();
                         Toast.makeText(MainActivity. this ,
                                 "選擇了--->>"  + select_item, Toast.LENGTH_SHORT)
                                 .show();
                     }
                 });
                 builder.setPositiveButton( "肯定" , new  OnClickListener() {
                     @Override
                     public  void  onClick(DialogInterface dialog, int  which) {
                         dialog.dismiss();
                     }
                });
                 builder.show();
             }
         });

 

  效果展現:

 

AlterDialog多選列表

  AlterDialog除了單選列表,還有多選的列表。可使用 Builder.setMultiChoiceItems(CharSequence[] items,boolean[] checkedItems,DialogInterface.OnMultiChoiceClickListener listener),這個方法也一樣具備多樣重載,對於這個方法,items以一個數組爲數據源;checkedItems是默認的選項,由於是多選列 表,因此若是設置須要所有設置,若是沒有默認選中,則傳Null;listener爲多選項點擊觸發事件。

  示例: 

?
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
btnListViewMulti.setOnClickListener( new  View.OnClickListener() {
  
             @Override
              public  void  onClick(View v) {
                 // TODO Auto-generated method stub
                AlertDialog.Builder builder = new  AlertDialog.Builder(
                         MainActivity. this );
                builder.setTitle( "請選擇城市" );
                  builder.setMultiChoiceItems(items, new  boolean [] { true , false ,
                          true  }, new  OnMultiChoiceClickListener() {
                     @Override
                     public  void  onClick(DialogInterface dialog, int  which,
                             boolean  isChecked) {
                         // TODO Auto-generated method stub
                         String select_item = items[which].toString();
                          Toast.makeText(MainActivity. this ,
                                  "選擇了--->>"  + select_item, Toast.LENGTH_SHORT)
                                  .show();
                      }
                  });
                  builder.setPositiveButton( "肯定" , new  OnClickListener() {
                      @Override
                     public  void  onClick(DialogInterface dialog, int  which) {
                         dialog.dismiss();
                     }
                  });
                 builder.show();
             }
          });

 

  效果展現:

 

 

AlertDialog自定義樣式

  有些時候,Android自帶的一些樣式設置已經沒法知足需求了,那麼可使用自定義樣式,自定義個XML佈局文件,用這個文件的內容做爲 AlertDialog的樣式展現在屏幕上,這樣就能夠靈活定製對話框了。對於定製的XML文件,可使用 LayoutInflater.from(Context).inflate(int,ViewGroup)的方式對其進行動態加載,而後使用 Builder.setView(View)把加載的視圖與Builder對象進行關聯,最後正常show()便可。

  佈局代碼:

?
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
<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"
     android:paddingBottom= "@dimen/activity_vertical_margin"
      android:paddingLeft= "@dimen/activity_horizontal_margin"
      android:paddingRight= "@dimen/activity_horizontal_margin"
      android:paddingTop= "@dimen/activity_vertical_margin"
      tools:context= ".MainActivity"  >
 
     <Button
          android:id= "@+id/btnGeneral"
         android:layout_width= "wrap_content"
          android:layout_height= "wrap_content"
          android:text= "普通對話框"  />
  
      <Button
          android:id= "@+id/btnButtons"
         android:layout_width= "wrap_content"
          android:layout_height= "wrap_content"
          android:text= "多按鈕的普通對話框"  />
  
     <Button
          android:id= "@+id/btnListView"
          android:layout_width= "wrap_content"
          android:layout_height= "wrap_content"
          android:text= "列表選擇對話框"  />
  
      <Button
         android:id= "@+id/btnListViewSingle"
          android:layout_width= "wrap_content"
          android:layout_height= "wrap_content"
          android:text= "單選列表選擇對話框"  />
  
      <Button
          android:id= "@+id/btnListViewMulti"
          android:layout_width= "wrap_content"
          android:layout_height= "wrap_content"
          android:text= "多選列表選擇對話框"  />
 
      <Button
          android:id= "@+id/btnProgressDialog"
          android:layout_width= "wrap_content"
          android:layout_height= "wrap_content"
          android:text= "滾動等待對話框"  />
  
      <Button
          android:id= "@+id/btnProgressDialogH"
          android:layout_width= "wrap_content"
          android:layout_height= "wrap_content"
          android:text= "進度條對話框"  />
      <Button
         android:id= "@+id/btnCustomDialog"
          android:layout_width= "wrap_content"
          android:layout_height= "wrap_content"
          android:text= "自定義對話框"  />
  </LinearLayout>

 

  實現代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
btnCustomDialog.setOnClickListener( new  View.OnClickListener() {
              
              @Override
             public  void  onClick(View v) {
                 AlertDialog.Builder builder= new  AlertDialog.Builder(MainActivity. this );
                  View view=LayoutInflater.from(MainActivity. this ).inflate(R.layout.dialog_signin, null );
                  Button btn=(Button)view.findViewById(R.id.btnCustom);
                  btn.setOnClickListener( new  View.OnClickListener() {
                      
                      @Override
                      public  void  onClick(View v) {
                          // TODO Auto-generated method stub
                          alertDialog.dismiss();
                         Toast.makeText(MainActivity. this , "表單填寫完成" ,
                                  Toast.LENGTH_SHORT).show();
                      }
                  });
                  builder.setView(view);
                  alertDialog=builder.show();               
              }
          });

 

  效果展現:

 

ProgressDialog

  有些時候,只是須要提示用戶等待,好比在執行耗時操做等的時候,可使用進度對話框來顯示一個進度信息,提示用戶等待,這個時候可使用 ProgressDialog。ProgressDialog的使用方式大部分能夠參見ProgressBar,其實就是一個封裝了 ProgressBar的對話框。

  ProgressDialog有 兩種顯示方式,一種是以一個滾動的環狀圖標,能夠顯示一個標題和一段文本內容的等待對話框;另一種是帶刻度的進度條,和常規的進度條用法一致。兩種樣式 經過ProgressDialog.setProgressStyle(int style)設置,能夠經過ProgressDialog的兩個常量進行設置:STYLE_HORIZONTAL:刻度滾 動;STYLE_SPINNER:圖標滾動,默認選項。

  對於圖標滾動,可使用兩種方式實現,一種是常規的調用構造函數,再設置對應的屬性;另一種是直接使用ProgressDialog的靜態方法show(),直接返回一個ProgressDialog對象,而且調用show()方法。

  示例:

?
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
btnProgressDialog.setOnClickListener( new  View.OnClickListener() {
  
              @Override
              public  void  onClick(View v) {
                  // 第一種方法,使用ProgressDialog構造函數
                  progressDialog = new  ProgressDialog(MainActivity. this );
                  progressDialog.setIcon(R.drawable.ic_launcher);
                  progressDialog.setTitle( "等待" );
                  progressDialog.setMessage( "正在加載...." );
                 progressDialog.show();
                  //第二種方法,使用靜態的show方法
                  //progressDialog=ProgressDialog.show(MainActivity.this, "等待", "正在加載....", false, false);
                  new  Thread( new  Runnable() {
  
                      @Override
                      public  void  run() {
                         try  {
                              Thread.sleep( 5000 );           
                          } catch  (Exception e) {
                              e.printStackTrace();
                          }
                         finally {
                              progressDialog.dismiss();
                          }                       
                      }
                  }).start();
              }
          });

 

  效果展現:

  對於有刻度的ProgressDialog,除了從AlertDialog中繼承來的屬性,有一些必要的屬性須要設置,如下方法都有對於的getter方法:

  • setMax(int max):最大刻度。
  • setProgress(int value):第一進度。
  • setSecondaryProgress(int value):第二進度。

  示例:

?
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
btnProgressDialog.setOnClickListener( new  View.OnClickListener() {
  
              @Override
              public  void  onClick(View v) {
                  // 第一種方法,使用ProgressDialog構造函數
                  progressDialog = new  ProgressDialog(MainActivity. this );
                  progressDialog.setIcon(R.drawable.ic_launcher);
                  progressDialog.setTitle( "等待" );
                  progressDialog.setMessage( "正在加載...." );
                  progressDialog.show();
                  //第二種方法,使用靜態的show方法
                  //progressDialog=ProgressDialog.show(MainActivity.this, "等待", "正在加載....", false, false);
                  new  Thread( new  Runnable() {
  
                      @Override
                      public  void  run() {
                         try  {
                              Thread.sleep( 5000 );           
                          } catch  (Exception e) {
                              e.printStackTrace();
                          }
                          finally {
                              progressDialog.dismiss();
                          }                       
                      }
                  }).start();
              }
          });

 

  效果展現:

Android--Dialog詳細講解
 
 
 

前言

  對話框對於應用也是必不可少的一個組件,在Android中也不例外,對話框對於一些提示重要信息,或者一些須要用戶額外交互的一些內容頗有幫 助。本篇博客就講解一下Android下對話框的使用,在本篇博客中,將瞭解到對話框的一些常規屬性的設置,以及各式的對話框的使用,並都會提供小 Demo來展現全部的效果。

Dialog

  Dialog,對話框,一個對話框就是一個小窗口,並不會填滿整個屏幕,一般是以模態顯示,要求用戶必須採起行動才能繼續進行剩下的操做。

  Android提供了豐富的對話框支持,它提供了以下4中經常使用的對話框:

  • AlertDialog:警告對話框,使用最普遍功能最豐富的一個對話框。
  • ProgressDialog:進度條對話框,只是對進度條進行了簡單的封裝。
  • DatePickerDialog:日期對話框。
  • TimePickerDialog:時間對話框。

  全部的對話框,都是直接或間接繼承自Dialog類,而AlterDialog直接繼承自Dialog,其餘的幾個類均繼承自AlterDialog。

 

AlertDialog

  AlertDialog繼承自Dialog類,對於Android內置的AlterDialog,它能夠包含一個標題、一個內容消息或者一個選擇列表、最多三個按鈕。而建立AlterDialog推薦使用它的一個內部類AlterDialog.Builder創 建。使用Builder對象,能夠設置AlterDialog的各類屬性,最後經過Builder.create()就能夠獲得AlterDialog對 象,若是隻是還須要顯示這個AlterDialog,通常能夠直接使用Builder.show()方法,它會返回一個AlterDialog對象,而且 顯示它。

  若是僅僅是須要提示一段信息給用戶,那麼就能夠直接使用AlterDialog的一些屬性設置提示信息,涉及到的方法有:

  • AlterDialog create():根據設置的屬性,建立一個AlterDialog。
  • AlterDialog show():根據設置的屬性,建立一個AlterDialog,而且顯示在屏幕上。
  • AlterDialog.Builder setTitle():設置標題。
  • AlterDialog.Builder setIcon():設置標題的圖標。
  • AlterDialog.Builder setMessage():設置標題的內容。
  • AlterDialog.Builder setCancelable():設置是否模態,通常設置爲false,表示模態,要求用戶必須採起行動才能繼續進行剩下的操做。

  Tips:AlterDialog.Builder的不少設置屬性的方法,返回的均是這個AlterDialog.Builder對象,因此可使用鏈式方式編寫代碼,這樣更方便。

  當一個對話框調用了show()方法後,展現到屏幕上,若是須要消除它,可使用DialogInterface接口聲明的兩個方 法,cancel()和dismiss()使對話框取或者消除,這兩個方法的做用是同樣的,不過推薦使用dismiss()。Dialog和 AlterDialog都實現了DialogInterface接口,因此只要是對話框,都可以使用這兩個方法來消除對話框。

  下面經過一個簡單的Demo,先看看AlterDialog是如何提示信息的:

  示例:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
btnGeneral.setOnClickListener( new  View.OnClickListener() {
  
              @Override
              public  void  onClick(View v) {
                  // TODO Auto-generated method stub
                  AlertDialog.Builder builder = new  AlertDialog.Builder(
                          MainActivity. this );
                 builder.setTitle( "提示" );
                  builder.setMessage( "這是一個普通的對話框!" );
                  builder.setIcon(R.drawable.ic_launcher);
                  builder.setCancelable( false );
                 builder.setPositiveButton( "知道了!" , new  OnClickListener() {
                      @Override
                      public  void  onClick(DialogInterface dialog, int  which) {
                          dialog.cancel();
                      }
                 });
                 builder.create().show();
              }
          });

 

展現效果:

 

AlterDialog的按鈕

  AlterDialog內置了三個按鈕,能夠直接使用setXxxButton()方法進行設置,對於通常的對話框,使用三個按鈕基本上也夠用了,下面是這三個方法的簽名:

  • AlterDialog.Builder setPositiveButton(CharSquence text , DialogInterFace.OnClickListener):一個積極的按鈕,通常用於「OK」或者「繼續」等操做。
  • AlterDialog.Builder setNegativeButton(CharSquence text , DialogInterFace.OnClickListener):一個負面的按鈕,通常用於「取消」操做。
  • AlterDialog.Builder setNeutralButton(CharSquence text , DialogInterFace.OnClickListener):一個比較中性的按鈕,通常用於「忽略」、「之後提醒我」等操做。

  上面介紹的DialogInterface接口,還提供了一系列的事件響應,這三個按鈕均須要傳遞一個 DialogInterFace.OnClickListener接口對象,實現其點擊事件的觸發,在這個接口中須要實現一個 onClick(DialogInterface dialog,int which),dialog爲當前觸發事件的對話框對象接口,能夠直接強制轉換爲AlterDialog進行操做;which爲點擊按鈕的標識符,是一個 整形的數據,對於這三個按鈕而言,每一個按鈕使用不一樣的int類型數據進行標識:Positive(-1)、Negative(-2)、 Neutral(-3)。

  而除了專門爲按鈕點擊實現的DialogInterFace.OnClickListener事件外,DialogInterface還提供了 一些其餘的事件,供Dialog對象響應,這些事件只是對Dialog聲明週期各個狀態的響應,一看就明白了,就再也不詳細講解了,下面是這幾個事件的說 明:

  • interface DialogInterface.OnCancelListener:當對話框調用cancel()方法的時候觸發。
  • interface DialogInterface.OnDismissListener:當對話框調用dismiss()方法的時候觸發。
  • interface DialogInterface.OnShowListener:當對話框調用show()方法的時候觸發。
  • interface DialogInterface.OnMultiChoiceListener:當對話框使用多選列表,而且選中的時候觸發。

  示例:

?
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
btnButtons.setOnClickListener( new  View.OnClickListener() {
 
              @Override
             public  void  onClick(View v) {
                  // TODO Auto-generated method stub
                  AlertDialog.Builder builder = new  AlertDialog.Builder(
                         MainActivity. this );
                  builder.setTitle( "提示" );
                  builder.setMessage( "這是一個多按鈕普通的對話框!" );
                 builder.setIcon(R.drawable.ic_launcher);
                 builder.setPositiveButton( "肯定" , new  OnClickListener() {
  
                      @Override
                      public  void  onClick(DialogInterface dialog, int  which) {                       
                          Toast.makeText(MainActivity. this , "肯定被點擊" ,
                                 Toast.LENGTH_SHORT).show();
                          dialog.dismiss();
                      }
                  });
                  builder.setNegativeButton( "否認" , new  OnClickListener() {
  
                      @Override
                     public  void  onClick(DialogInterface dialog, int  which) {
                          // TODO Auto-generated method stub
                          Toast.makeText(MainActivity. this , "否認被點擊" ,
                                 Toast.LENGTH_SHORT).show();
                         dialog.dismiss();
                    }
                  });
                  builder.setNeutralButton( "忽略" , new  OnClickListener() {
 
                      @Override
                      public  void  onClick(DialogInterface dialog, int  which) {
                          // TODO Auto-generated method stub
                          Toast.makeText(MainActivity. this , "忽略被點擊" ,
                                 Toast.LENGTH_SHORT).show();
                          dialog.cancel();
                      }
                  });
                  builder.show();
              }
          });

 

  展現效果:

 

AlterDialog的列表形式

  AlterDialog除了展現一些提示信息,還能夠展現一種列表的形式,須要使用到 Builder.setItems(CharSequence[] items,DialogInterface.OnClickListener listener)方法進行設置,它須要傳遞一個CharSequenece類型的數組,以綁定列表的數據,它一樣須要傳遞一個 DialogInterface.OnClickListener接口,以響應列表項的點擊,而這個接口中onClick方法的which參數,爲當前點 擊觸發項的items中的下標。

  示例:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
btnListView.setOnClickListener( new  View.OnClickListener() {
 
     @Override
     public  void  onClick(View v) {
         // TODO Auto-generated method stub
        AlertDialog.Builder builder = new  AlertDialog.Builder(
                MainActivity. this );
         builder.setTitle( "請選擇城市" );
         //items使用全局的finalCharSequenece數組聲明
         builder.setItems(items, new  OnClickListener() {
             @Override
             public  void  onClick(DialogInterface dialog, int  which) {
                 // TODO Auto-generated method stub
                 String select_item = items[which].toString();
                 Toast.makeText(MainActivity. this ,
                         "選擇了---》"  + select_item, Toast.LENGTH_SHORT)
                         .show();
             }
         });
         builder.show();
     }
});
  效果展現: 

 

 AlterDialog的單選列表

  AlterDialog還可使用一種單選的列表樣式,使用 Builder.setSingleChoiceItems(CharSequenece[] items,int checkedItem,DialogInterface.OnClickListener listener),這個方法具備多項重載,主要是爲了應對不一樣的數據源,items爲列表項數組,checkedItem爲初始選項,listener 爲點擊響應事件。有時候並不必定須要選中以後就關閉對話框,能夠設置兩個按鈕,用於肯定選擇。

  示例:

?
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
btnListViewSingle.setOnClickListener( new  View.OnClickListener() {
             @Override
             public  void  onClick(View v) {
                 // TODO Auto-generated method stub
                 AlertDialog.Builder builder = new  AlertDialog.Builder(
                         MainActivity. this );
                 builder.setTitle( "請選擇一下城市" );
                 builder.setSingleChoiceItems(items, 1 , new  OnClickListener() {
 
                     @Override
                     public  void  onClick(DialogInterface dialog, int  which) {
                         // TODO Auto-generated method stub
                        String select_item = items[which].toString();
                         Toast.makeText(MainActivity. this ,
                                 "選擇了--->>"  + select_item, Toast.LENGTH_SHORT)
                                 .show();
                     }
                 });
                 builder.setPositiveButton( "肯定" , new  OnClickListener() {
                     @Override
                     public  void  onClick(DialogInterface dialog, int  which) {
                         dialog.dismiss();
                     }
                });
                 builder.show();
             }
         });

 

  效果展現:

 

AlterDialog多選列表

  AlterDialog除了單選列表,還有多選的列表。可使用 Builder.setMultiChoiceItems(CharSequence[] items,boolean[] checkedItems,DialogInterface.OnMultiChoiceClickListener listener),這個方法也一樣具備多樣重載,對於這個方法,items以一個數組爲數據源;checkedItems是默認的選項,由於是多選列 表,因此若是設置須要所有設置,若是沒有默認選中,則傳Null;listener爲多選項點擊觸發事件。

  示例: 

?
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
btnListViewMulti.setOnClickListener( new  View.OnClickListener() {
  
             @Override
              public  void  onClick(View v) {
                 // TODO Auto-generated method stub
                AlertDialog.Builder builder = new  AlertDialog.Builder(
                         MainActivity. this );
                builder.setTitle( "請選擇城市" );
                  builder.setMultiChoiceItems(items, new  boolean [] { true , false ,
                          true  }, new  OnMultiChoiceClickListener() {
                     @Override
                     public  void  onClick(DialogInterface dialog, int  which,
                             boolean  isChecked) {
                         // TODO Auto-generated method stub
                         String select_item = items[which].toString();
                          Toast.makeText(MainActivity. this ,
                                  "選擇了--->>"  + select_item, Toast.LENGTH_SHORT)
                                  .show();
                      }
                  });
                  builder.setPositiveButton( "肯定" , new  OnClickListener() {
                      @Override
                     public  void  onClick(DialogInterface dialog, int  which) {
                         dialog.dismiss();
                     }
                  });
                 builder.show();
             }
          });

 

  效果展現:

 

 

AlertDialog自定義樣式

  有些時候,Android自帶的一些樣式設置已經沒法知足需求了,那麼可使用自定義樣式,自定義個XML佈局文件,用這個文件的內容做爲 AlertDialog的樣式展現在屏幕上,這樣就能夠靈活定製對話框了。對於定製的XML文件,可使用 LayoutInflater.from(Context).inflate(int,ViewGroup)的方式對其進行動態加載,而後使用 Builder.setView(View)把加載的視圖與Builder對象進行關聯,最後正常show()便可。

  佈局代碼:

?
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
<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"
     android:paddingBottom= "@dimen/activity_vertical_margin"
      android:paddingLeft= "@dimen/activity_horizontal_margin"
      android:paddingRight= "@dimen/activity_horizontal_margin"
      android:paddingTop= "@dimen/activity_vertical_margin"
      tools:context= ".MainActivity"  >
 
     <Button
          android:id= "@+id/btnGeneral"
         android:layout_width= "wrap_content"
          android:layout_height= "wrap_content"
          android:text= "普通對話框"  />
  
      <Button
          android:id= "@+id/btnButtons"
         android:layout_width= "wrap_content"
          android:layout_height= "wrap_content"
          android:text= "多按鈕的普通對話框"  />
  
     <Button
          android:id= "@+id/btnListView"
          android:layout_width= "wrap_content"
          android:layout_height= "wrap_content"
          android:text= "列表選擇對話框"  />
  
      <Button
         android:id= "@+id/btnListViewSingle"
          android:layout_width= "wrap_content"
          android:layout_height= "wrap_content"
          android:text= "單選列表選擇對話框"  />
  
      <Button
          android:id= "@+id/btnListViewMulti"
          android:layout_width= "wrap_content"
          android:layout_height= "wrap_content"
          android:text= "多選列表選擇對話框"  />
 
      <Button
          android:id= "@+id/btnProgressDialog"
          android:layout_width= "wrap_content"
          android:layout_height= "wrap_content"
          android:text= "滾動等待對話框"  />
  
      <Button
          android:id= "@+id/btnProgressDialogH"
          android:layout_width= "wrap_content"
          android:layout_height= "wrap_content"
          android:text= "進度條對話框"  />
      <Button
         android:id= "@+id/btnCustomDialog"
          android:layout_width= "wrap_content"
          android:layout_height= "wrap_content"
          android:text= "自定義對話框"  />
  </LinearLayout>

 

  實現代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
btnCustomDialog.setOnClickListener( new  View.OnClickListener() {
              
              @Override
             public  void  onClick(View v) {
                 AlertDialog.Builder builder= new  AlertDialog.Builder(MainActivity. this );
                  View view=LayoutInflater.from(MainActivity. this ).inflate(R.layout.dialog_signin, null );
                  Button btn=(Button)view.findViewById(R.id.btnCustom);
                  btn.setOnClickListener( new  View.OnClickListener() {
                      
                      @Override
                      public  void  onClick(View v) {
                          // TODO Auto-generated method stub
                          alertDialog.dismiss();
                         Toast.makeText(MainActivity. this , "表單填寫完成" ,
                                  Toast.LENGTH_SHORT).show();
                      }
                  });
                  builder.setView(view);
                  alertDialog=builder.show();               
              }
          });

 

  效果展現:

 

ProgressDialog

  有些時候,只是須要提示用戶等待,好比在執行耗時操做等的時候,可使用進度對話框來顯示一個進度信息,提示用戶等待,這個時候可使用 ProgressDialog。ProgressDialog的使用方式大部分能夠參見ProgressBar,其實就是一個封裝了 ProgressBar的對話框。

  ProgressDialog有 兩種顯示方式,一種是以一個滾動的環狀圖標,能夠顯示一個標題和一段文本內容的等待對話框;另一種是帶刻度的進度條,和常規的進度條用法一致。兩種樣式 經過ProgressDialog.setProgressStyle(int style)設置,能夠經過ProgressDialog的兩個常量進行設置:STYLE_HORIZONTAL:刻度滾 動;STYLE_SPINNER:圖標滾動,默認選項。

  對於圖標滾動,可使用兩種方式實現,一種是常規的調用構造函數,再設置對應的屬性;另一種是直接使用ProgressDialog的靜態方法show(),直接返回一個ProgressDialog對象,而且調用show()方法。

  示例:

?
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
btnProgressDialog.setOnClickListener( new  View.OnClickListener() {
  
              @Override
              public  void  onClick(View v) {
                  // 第一種方法,使用ProgressDialog構造函數
                  progressDialog = new  ProgressDialog(MainActivity. this );
                  progressDialog.setIcon(R.drawable.ic_launcher);
                  progressDialog.setTitle( "等待" );
                  progressDialog.setMessage( "正在加載...." );
                 progressDialog.show();
                  //第二種方法,使用靜態的show方法
                  //progressDialog=ProgressDialog.show(MainActivity.this, "等待", "正在加載....", false, false);
                  new  Thread( new  Runnable() {
  
                      @Override
                      public  void  run() {
                         try  {
                              Thread.sleep( 5000 );           
                          } catch  (Exception e) {
                              e.printStackTrace();
                          }
                         finally {
                              progressDialog.dismiss();
                          }                       
                      }
                  }).start();
              }
          });

 

  效果展現:

  對於有刻度的ProgressDialog,除了從AlertDialog中繼承來的屬性,有一些必要的屬性須要設置,如下方法都有對於的getter方法:

  • setMax(int max):最大刻度。
  • setProgress(int value):第一進度。
  • setSecondaryProgress(int value):第二進度。

  示例:

?
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
btnProgressDialog.setOnClickListener( new  View.OnClickListener() {
  
              @Override
              public  void  onClick(View v) {
                  // 第一種方法,使用ProgressDialog構造函數
                  progressDialog = new  ProgressDialog(MainActivity. this );
                  progressDialog.setIcon(R.drawable.ic_launcher);
                  progressDialog.setTitle( "等待" );
                  progressDialog.setMessage( "正在加載...." );
                  progressDialog.show();
                  //第二種方法,使用靜態的show方法
                  //progressDialog=ProgressDialog.show(MainActivity.this, "等待", "正在加載....", false, false);
                  new  Thread( new  Runnable() {
  
                      @Override
                      public  void  run() {
                         try  {
                              Thread.sleep( 5000 );           
                          } catch  (Exception e) {
                              e.printStackTrace();
                          }
                          finally {
                              progressDialog.dismiss();
                          }                       
                      }
                  }).start();
              }
          });

 

  效果展現:

   源碼下載

 總結

   源碼下載

 總結

相關文章
相關標籤/搜索