AlertDialog(對話框)詳解


本節引言:

本節繼續帶給大家是顯示提示訊息的第三個控制項AlertDialog(對話框),同時它也是其他 Dialog的的父類!例如ProgressDialog,TimePickerDialog等,而AlertDialog的父類別是:Dialog! 另外,不像前面學習的Toast和Notification,AlertDialog並不能直接new出來,如果你打開 AlertDialog的原始碼,會發現建構方法是protected的,如果我們要建立AlertDialog的話,我們 需要使用到該類別中的靜態內部類別:public static class Builder,然後來呼叫AlertDialog 裡的相關方法,來對AlertDialog進行定制,最後調用show()方法來顯示我們的AlertDialog對話框! 好的,下面我們就來學習AlertDialog的基本用法,以及客製化我們的AlertDialog! 官方文件:AlertDialog


1.基本使用流程

  • Step 1:建立AlertDialog.Builder物件;
  • Step 2:呼叫setIcon()設定圖標,setTitle()setCustomTitle()設定標題;
  • Step 3:設定對話方塊的內容:setMessage()還有其他方法來指定顯示的內容;
  • Step 4:呼叫setPositive/Negative/NeutralButton()設定:確定,取消,中立按鈕;
  • Step 5:呼叫create()方法建立這個對象,再呼叫show()方法將對話框顯示出來;

##2.幾種常用的對話方塊使用範例

執行效果圖:

1.gif

核心程式碼

MainActivity.java

公共類別 MainActivity 擴充 AppCompatActivity 實作 View.OnClickListener{

    私有按鈕 btn_dialog_one;
     
    私有上下文mContext;
#     boolean[] checkItems;

     AlertDialog alert = null;
  私有 AlertDialog alert  @Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
   = MainActivity.this;
        bindView();


    }

    private void bindView() {
        b200.one btn_dialog_two = (Button) findViewById(R.id. btn_dialog_two) );
        btn_dialog_third        btn_dialog_third        btn_dialog_third        btn_dialog_third our);
        btn_dialog_one.setOnClickListener(this) ;
        btn_dialog_two ? ) {
        switch (v.getId()) {
   newase R.id.btn_dialog_one:
                alert = null;
      Builder(mContext );
alert = builder.setIcon(R.mipmap.ic_icon_fish)
                            .setMessage("這是一個最普通的AlertDialog,\n有三個按鈕,分別是取消,中立與確定")
                        .setNegativeButton("取消", new               @Override
                 {
                                Toast.makeText(mContext,       Toast.makeText(mContext, "你點選了取消按鈕~", Toast.LENGTH_SHORT).show();
                              })
                        )                    @Override
                            public void onClickCDialog                  Toast.makeText(mContext, "你點選了確定按鈕~", Toast.LENGTH_SHORT).show();
}
                        })
        DialogInterface.OnClickListener() {
                                  public void onClick(DialogInterface dialog, int whi ch) {
           text , "你點選了中立按鈕~", Toast.LENGTH_SHORT).show();
                               }).create();             //創建AlertDialog物件
                //顯示對話框
              地               final String[] lesson = new String[]{"語文", "數學", "英文", "化學", "生物", "物理", "體育"};
                alert log.Builder(mContext);
alert = builder.setIcon(R.mipmap.ic_icon_fish)
                                .setItems(lesson, new DialogInter甲.OnClickListener() {
                                    public void onClick(DialogInterface dialog, int which) {
                   + lesson[which], Toast.LENGTH_SHORT).show();
                             }) .create();
                alert.show();
           #            case R.id.btn_dialog_three:
               []{"蘋果", "雪梨", "香蕉", "葡萄", "西瓜"};
                )  AlertDialog.Builder(mContext);
                alert = builder .setIcon(R.mipmap.ic_icon_fish)
.setTitle("選擇喜歡的水果,只能選一個~")
                                              @Override
       Interface dialog, int which) {
                              TH_SHORT).show();
                             ).create();
                alert.show();
                        case R.id.btn_dialog_four:
                豆腐", "蘿蔔牛腩", "醬油雞", "胡椒豬肚雞"};
                //定義一個用來記錄 = new boolean[]{false, false, false, false};
                alert = null;
     ##                alert = builder.setIcon(R.mipmap.ic_icon_fish)
                   {
                                       public void onClick(DialogInterfacedialog,intwhich,booleanisChecked) {
                                checkItems[which] = isChecked;
                           }
                        })
                         .setPositiveButton("確定", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface對話框, int ) {
                             我              for (int i           if (checkItems[i])
                                                          Toast.makeText(getApplicationContext(), "客官你點了:" + 結果, Toast.LENGTH_ SHORT).show();##Toast.LENGTH_ SHORT).show();##Toast.LENGTH_ SHORT).show();##Toast.LENGTH_ SHORT).show();##Toast.LENGTH_ SHORT).show();##Toast.LENGTH_ SHORT).show();##Toast.LENGTH_ SHORT).show();##Toast.LENGTH_ SHORT)。 }
                        })
                        .create();
               alert.show();
                break;
        }
    }
}

佈局就是四個簡單的按鈕,這裡就不貼出來了,用法非常簡單~無非就是創建一個Builder物件後, 進行相關設置,然後create()產生一個AlertDialog對象,最後呼叫show()方法將AlertDialog 顯示出來而已!另外,細心的你可能會發現我們點擊對話框的外部區域,對話框就會消失,我們 可以為builder設定setCancelable(false)即可解決這個問題!


3.透過Builder的setView()自訂顯示的AlertDialog

#我們可以自訂一個與系統對話方塊不同的佈局,然後呼叫setView()將我們的佈局載入到 AlertDialog上,上面我們來實現這個效果:

運行效果圖

2.gif

關鍵程式碼

首先是兩個不同按鈕的selctor的drawable檔案:

btn_selctor_exit.xml

##<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:drawable="@mipmap/iv_icon_exit_pressed"/>
    <item android:drawable="@mipmap/iv_icon_exit_normal"/>##<##>

btn_selctor_choose.xml

#<?xml version="1.0" encoding="utf-8"?>

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:drawable="@mipmap/bg_btn_pressed"/>
    <item android:drawable="@mipmap/bg_btn_normal"/>
</selector>

#

接著是自訂的Dialog佈局:view_dialog_custom.xml

<?
    android:id="@+id/RelativeLayout1"
    android:layout_width="match_parent"
    and #                   android:id="@+id/titlelayout"
        and?       android:layout_alignParentLeft="true "
android:layout_alignParentTop="true"
        android:background="../style/images/android-tutorial-alertdialog.html"
     ##            android:layout_width="match_parent"
            android 「
            android:text="提示資訊"
            android:text="提示資訊"
            android:text="提示資訊"
            android:text="12:text "
            android:textSize="18sp"
            and      android:id="@+id /btn_cancle"
            android: layout_width="30dp"
            android:layout_height="30dp"
         roid:background="../style/images/btn_selctor _退出」 />

    


    <LinearLayout
        and?   android:layout_alignParentLeft="true"
android:layout_below="@+id/titlelayout"
        android:layout_centerInParent="true"
            android:layout_width=" wrap_content"
            android:layout_height="wrap_content"
            
            android:text="透過setView()方法客製化AlertDialog"
            android :textColor="#04AEDA"
            android:textSize="18sp" />

#       ##            android:layout_height="wrap_content "
android:layout_marginLeft="10dp"
            android:layout_marginTop="10dp"
        android:textColor="#04AEDA"
            安卓:textSize=" 18sp" />
    

#                   android :layout_below="@+id /ly_detail"
        android:layout_marginTop="10dp"
        android:orientation="horizo​​ntal">

                  android:layout_width= " match_parent"
            android:layout_height="40dp"
            ="1"
            android:background="../style/images/btn_selctor_choose"
            and? #        <按鈕
            android:id= " @+id/btn_close"
            android:layout_width="match_parent"
         :layout_margin="5dp"
            android:layout_weight="1"
android :background="/style/images/btn_selctor_choose"
            android:text="關閉"
       :textSize="20sp" />

    

#

最後是MainActivity.java

公有類別MainActivity 擴充AppCompatActivity {

    私有按鈕btn_show;
#    私有視圖 view_custom;
     私有AlertDialog .Builder builder = null;

    @Override
    protected void onCreate(Bundle saved     setContentView(R.layout.activity_main);
mContext = MainActivity.this;
        btn_show = (Button) findViewById(R.id.btn_show);
# Dialog.Builder(mContext);

        //在其中一個載入自訂的View,同時設定下
        final LayoutInflater inflater = MainActivity.this.getLayoutInflaterInflater inflater = MainActivity.this.getLayoutInflater();#. late(R.layout.view_dialog_custom, null,false);
        builder.setView(view_custom);
        builder.setCancelable(false);
    #c view_custom.findViewById(R.id.btn_cancle).setOnClickListener( new View.OnClickListener() {
            @Override
              alert.dismiss();
            }
        });
##  findViewById (R.id.btn_blog).setOnClickListener(new View.OnClickListener() {
                                Toast.makeText(getApplicationContext(), "訪問部落格", Toast.LENGTH_SHORT).show();
                Urico#uri       Intent intent = new Intent(Intent.ACTION_VIEW, uri);
                            }
         });

        view_custom .findViewByCyIdIId. R.id.btn_close).setOnClickListener(new View.OnClickListener() {
            @Override
               Toast.makeText(getApplicationContext(), "對話方塊已關閉~" , Toast.LENGTH_SHORT).show();
                alert.dismiss();
          btn_show.setOnClickListener(new View.OnClickListener() {
             @覆蓋
            public void onClick(View v) {
                 });
    }
}



#4.範例程式碼下載

AlertDialogDemo.zip

AlertDialogDemo1.zip
#本節小結:

好的,本節跟大家介紹一下AlertDialog的基本使用,寫了幾個呼叫AlertDialog的例子, 最後還是透過setView方法自訂我們的AlertDialog! 真正的自訂控件,我們把自訂控件放在進階系列中,到時候會有一個專題來和大家討論 下自訂控制~寶寶期待~就說這麼多,謝謝~