Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android對話框的使用總結

Android對話框的使用總結

編輯:關於Android編程

一.相關概念

一個對話框一般是一個出現在當前Activity之上的一個小窗口. 處於下面的Activity失去焦點, 對話框接受所有的用戶交互. 對話框一般用於提示信息和與當前應用程序直接相關的小功能.
Android API 支持下列類型的對話框對象:

(一)警告對話框 AlertDialog: 一個可以有0到3個按鈕, 一個單選框或復選框的列表的對話框. 警告對話框可以創建大多數的交互界面, 是推薦的類型.

(二)進度對話框 ProgressDialog: 顯示一個進度環或者一個進度條. 由於它是AlertDialog的擴展, 所以它也支持按鈕.

(三)日期選擇對話框 DatePickerDialog: 讓用戶選擇一個日期.

(四)時間選擇對話框 TimePickerDialog: 讓用戶選擇一個時間

 

二.AlertDialog的創建和使用



AlertDialog是Dialog的一個直接子類,使用AlertDialog,我們可以顯示一個標題,最多3個按鈕操作,以及一組選擇框或者是自己定義的彈出框。
AlertDialog要使用Builder設計模式來創建對象 。
 

(一)Dialog的創建和使用


在時間應用中的對話框基本不用Dialog而是用它的子類。
這裡簡單使用一下Dialog,代碼如下:

// 普通的對話框,普通的對話框功能很少,除非重寫類
    public void bt1(View v) {
        // 創建對話框對象
        Dialog dialog = new Dialog(this);
        // 創建對話框內容  
         dialog.setTitle("對話框的標題");     
        // 顯示對話框
        dialog.show();

    }


運行後顯示結果:

Dialog1

可以看到有一個標題的對話框,而且這裡沒有設置內容的屬性,Dialog的使用方法和功能都是很少的,不建議使用。
 

(二)比較正常的AlertDialog的創建和使用

代碼設計:

// 警告對話框,需要用Builder方法創建
    public void bt2(View v) {
        // 這裡的屬性可以一直設置,因為每次設置後返回的是一個builder對象
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        // 設置提示框的標題
        builder.setTitle("提示標題").
        // 設置提示框的圖標
                setIcon(R.drawable.ic_launcher).
                // 設置要顯示的信息
                setMessage("文本的提示信息:你媽喊你回家吃飯了!").
                // 設置確定按鈕
                setPositiveButton("確定", new OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        Toast.makeText(MainActivity.this, "選擇就確定哦", 0).show();

                    }
                }).

                // 設置取消按鈕,null是什麼都不做
                setNegativeButton("取消", null).
                // 設置退出按鈕,在中間的按鈕
                setNeutralButton("退出", new OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        // 退出程序
                        finish();

                    }
                });
        // 生產對話框
        AlertDialog alertDialog = builder.create();
        // 顯示對話框
        alertDialog.show();

    }

程序運行後顯示的結果:

AlertDialog2

這裡如果點擊取消,對話框消失,什麼都沒有做。
如果點擊退出,會直接退出程序。
如果點擊確定,會彈出一個土司,提示你。
這裡可以根據用戶的選擇做出相應的行為。

 <喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxoMiBpZD0="三設計一個選擇菜單樣式的對話框">(三)設計一個選擇菜單樣式的對話框

代碼設計:

    //數據源
    String[] array = new String[] { "音樂", "體育", "舞蹈", "看書" };

    // 顯示一個菜單的對話框選項,點擊選擇菜單後,菜單會消失

    // 匿名類去創建
    public void bt3(View v) {

        final AlertDialog.Builder builder = new AlertDialog.Builder(this);
        // 設置標題
        builder.setTitle("選擇你最喜歡的課程").
        // 設置可選擇的內容,並添加點擊事件
                setItems(array, new OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        // which代表的是選擇的標簽的序列號

                        Toast.makeText(MainActivity.this, "選擇" + array[which],
                                0).show();

                    }
                }).
                // 產生對話框,並顯示出來
                create().show();

    }

程序運行後顯示的結果:

菜單對話框

設置菜單是builder的setItem方法來完成的。
點擊某一個菜單選項後對話框會自動消失,所以這裡設置按鈕也是沒有什麼用處的。
這裡還能監聽點擊菜單的事件,獲取用戶的選擇內容。


 

(四)設置一個單選按鈕菜單的對話框

其實這個對話框和上面的菜單對話框差不多,只是樣式改變了,還有一點不同的是點擊一個選項後對話框是不會消失的,所以必須要設置按鈕,來使對話框消失。

代碼設計:

// 單選按鈕的對話框,選擇一個按鈕值後,
    // 對話框也是不會自動消失,需要自己關閉
    // 要設置按鈕,點擊按鈕後對話框才會消失
    public void bt4(View v) {
        final AlertDialog.Builder builder = new AlertDialog.Builder(this);
        // 設置標題
        builder.setTitle("選擇你最喜歡的課程").
        // 設置可選擇的內容,並添加點擊事件
        // 第一個參數是可以選擇的單選框的內容
        // 第二個參數是默認選中的項
        // 第三個參數是點擊選中的監聽器
                setSingleChoiceItems(array, 0, new OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                        Toast.makeText(MainActivity.this, "選擇" + array[which],
                                0).show();

                    }
                }).
                // 因為對話框不會自動消失,所以要添加按鈕的必要
                // 設置確定按鈕
                setPositiveButton("確定", new OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        Toast.makeText(MainActivity.this, "選擇確定", 0).show();
                    }
                }).
                // 取消,什麼都不做,對話框消失而已
                setNegativeButton("取消", null).
                // 產生對話框,並顯示出來
                create().show();

    }


運行後的結果:

單選對話框

設置單選菜單是builder的setSingleChoiceItem方法來完成的。
這裡要可以設置兩個監聽事件,一個是單選按鈕某一個選項被選中時觸發的,另一個是點擊按鈕時觸發的事件。
程序中每次選中一個單選按鈕都會彈出一個吐司,提示你選擇的內容,點擊確定後也會顯示一個吐司。

 

(五)多選項的對話框設計

多選框的顯示和單選的顯示也是有點相似的,都是需要設置按鈕來使對話框消失。
代碼如下:

// 多選按鈕的對話框
    // 對話框也是不會自動消失,需要自己關閉
    // 要設置按鈕,點擊按鈕後對話框才會消失
    public void bt5(View v) {

        // 多選按鈕的默認狀態
        boolean[] checkedItems = { true, false, false, true };

        // 多選按鈕選中後保存的數據
        final List list = new ArrayList();
        // 默認的數據
        list.add("音樂");
        list.add("看書");
        // 創建對話框的builder對象
        final AlertDialog.Builder builder = new AlertDialog.Builder(this);

        // 設置標題
        builder.setTitle("選擇你最喜歡的課程").
        // 設置可選擇的內容,並添加點擊事件
        // 第一個參數是可以選擇的選框的內容
        // 第二個參數是一個布爾數組,如果是true代表的是默認選中
        // 第三個參數是點擊選中的監聽器
                setMultiChoiceItems(array, checkedItems,
                        new OnMultiChoiceClickListener() {

                            @Override
                            public void onClick(DialogInterface dialog,
                                    int which, boolean isChecked) {
                                // 這裡無論某個選項是被選中後被取消都會觸發該方法
                                // which代表的是選中的是多少游標值的選項
                                // isChecked是代表該選項是或否選中了
                                // 判斷如果集合中有某個數據,就把他移除,否則就添加數據
                                // 注意這裡數選擇之後的狀態
                                if (isChecked) {
                                    // 添加數據
                                    list.add(array[which]);
                                } else {
                                    // 移除數據
                                    list.remove(array[which]);
                                }

                            }
                        }).
                // 因為對話框不會自動消失,所以要添加按鈕的必要
                // 設置確定按鈕
                setPositiveButton("確定", new OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        Toast.makeText(MainActivity.this, "你選中了" + list, 0)
                                .show();
                    }
                }).
                // 取消,什麼都不做,對話框消失而已
                setNegativeButton("取消", null).
                // 產生對話框,並顯示出來
                create().show();

    }


程序運行後的結果:

多選框

設置多選菜單是builder的setMultiChoiceItem方法來完成的。
這裡要可以設置兩個監聽事件,一個是選項框的某一個選項的狀態改變時觸發的,另一個是點擊按鈕時觸發的事件。
程序中每次改變選項的內容,保存數據的集合都會改變,點擊確定後也會顯示一個吐司,顯示集合裡面的內容。

選擇全部內容後,確定,顯示的結果:

多選框點擊後結果

 

(六)使用適配器顯示對話框


使用適配器顯示對話框和顯示菜單對話框類似,都是選中對應選項後,對話框自動消失,但是使用適配器可以顯示很負責的界面。

// 使用適配器顯示對話框-->builder的setAdapter方法
    // 這裡選擇一個選項後,對話框就會關閉,所以是不需要設置按鈕的
    // 其實這裡可以設置很復雜的適配器對象,但是實際應用中不會在對話框顯示太復雜的布局
    public void bt6(View v) {

        // 創建ArrayAdapter適配器
        // android.R.layout.simple_list_item_1是Android系統裡面的簡單布局
        // 第三個參數是數據源
        ArrayAdapter adapter = new ArrayAdapter(this,
                android.R.layout.simple_list_item_1, array);

        // 創建對話框對象
        new AlertDialog.Builder(this).
        // 設置標題
                setTitle("使用適配器顯示數據").
                // 添加適配器,並為適配器添加點擊事件
                setAdapter(adapter, new OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        // which是選擇的條目的游標值
                        Toast.makeText(MainActivity.this, "選擇" + array[which],
                                0).show();
                    }
                }).
                // 產生並顯示
                create().show();

    }


運行程序後顯示的結果:

適配器

設置多選菜單是builder的setAdapter方法來完成的。
這裡要設置一個監聽事件,適配器的監聽事件。
這裡點擊某一個選項後,對話框消失,並土司選中的內容。

 

(七)設計一個有輸入框的對話框

// 設置一個有輸入文本的對話框---->builder的setView方法
    // 輸入數據後,對數據進行處理
    // 這裡要設置按鈕,才能對數據的數據進行處理
    public void bt7(View v) {

        // 創建一個EditText對象
        final EditText et = new EditText(this);

        // 創建對話框對象
        new AlertDialog.Builder(this).
        // 設置標題
                setTitle("有輸入框的對話框").
                // 添加輸入的文本框
                setView(et).
                // 添加確定按鈕
                setPositiveButton("確定", new OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        // 獲取輸入的字符
                        String in = et.getText().toString();
                        Toast.makeText(MainActivity.this, "輸入;" + in, 0).show();
                    }
                }).setNegativeButton("取消", null).
                // 產生並顯示
                create().show();

    }

運行後的結果:

有輸入框的對話框

設置輸入框是builder的setView方法來完成的。
這裡要設置一個按鈕監聽事件。
這裡點擊確定按鈕後,獲取輸入框的內容並土司出來。

 

(八)使用對話框內的控件控制對話框

這裡使用對話框內的一個布局文件的按鈕,來關閉對話框

    // 使用對話框內的控件來關閉對話框
    public void bt8(View v) {

        // 創建一個EditText對象
        final Button btn = new Button(this);
        // 給按鈕設置文字
        btn.setText("關閉對話框");
        // 創建對話框對象
        final AlertDialog dialog = new AlertDialog.Builder(this).
        // 設置標題
                setTitle("通過按鈕關閉對話框").
                // 添加輸入的文本框
                setView(btn).
                // 產生
                create();

        // 設置對話框不可以關閉,一般情況下對話框是失去焦點後自動消失的
        // 但是加 了.setCancelable(false),對話框就不會消失,除非手動退出
        dialog.setCancelable(false);

        btn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // 點擊後關閉對話框,兩種方法都可以
                 dialog.cancel();
                //dialog.dismiss();
            }
        });

        // 顯示
        dialog.show();

        //給對話框設置一個監聽時間,對話框退出前會執行
        dialog.setOnDismissListener(new OnDismissListener() {

            @Override
            public void onDismiss(DialogInterface dialog) {
                // 只要關閉都會調用
                Toast.makeText(MainActivity.this, "關閉", Toast.LENGTH_SHORT)
                        .show();
            }
        });

    }

運行結果:

關閉對話框

這裡設置了dialog.setCancelable(false);的屬性,代表了對話框不能隨著焦點的失去而消失對話框,要收到關閉對話框,要麼設置確定和取消按鈕,要麼在對話框布局中設置能夠關閉對話框的控件;



 

(九)AlertDialog的詳細屬性

對話框的全部屬性表現,如圖所示:
Dialog屬性圖


這裡分上、中、下三部分。
區域一是標題相關
區域二是主體相關
區域三是按鈕相關


其中任何部分都可以不設置,
但是有一點要注意的是主體內容只能有一種,比如:設置了SetMessage不能再設置SetAdapter或SetView。因為設置了也不會顯示的。

1.區域1那裡就是定義彈出框的頭部信息

包括標題名或者是一個圖標。
(1)setTitle : 為對話框設置標題
(2)setIcon : 為對話框設置圖標

2.區域2那裡是AlertDialog對話框的content部分

在這裡我們可以設置一些message信息,或者是定義一組選擇框,還可以定義我們自己的布局彈出框。
(1)setMessage: 為對話框設置內容,如果設置了其他內容,那麼Message不要設置,否者只顯示Message。
(2)setView: 給對話框設置自定義View
setItems: 設置對話框要顯示的一個list,一般用於顯示幾個命令時
//items是傳入一個字符串數組,或者是R文件中的數組
(3)setSingleChoiceItems: 用來設置對話框顯示一系列的單選按鈕
(4)setMultiChoiceItems: 用來設置對話框顯示一系列的復選框

3.區域3那裡使我們的Action Buttons部分

這裡我們可以定義我們的操作按鈕。
在AlertDialog中,定義按鈕都是通過 setXXXButton 方法來完成,其中一共有3種不同的Action Buttons供我們選擇:
(1)setPositiveButton(CharSequence text, DialogInterface.OnClickListener listener)
這是一個相當於OK、確定操作的按鈕.
(2)setNegativeButton (CharSequence text, DialogInterface.OnClickListener listener)
這是一個相當於取消操作的按鈕。

(3)setNeutralButton (CharSequence text, DialogInterface.OnClickListener listener)
這個是相當於一個忽略操作的按鈕。

觸發相關按鈕都的行為都是我們程序員自己定的,比如你可以設置點擊確定後關閉頁面,也可以設置點擊取消後關閉頁面。但是我們設計的時候還是要按照大部分人的閱讀習慣來設定。

4.監聽事件的說明

在AlertDialog的各種設置中,都充斥著DialogInterface.OnClickListener,比如按鈕,內容區的items,單選按鈕等,只有多選按鈕是用了另外一個監聽
DialogInterface.OnMultiChoiceClickListener。

(1)單選按鈕的監聽
public void onClick(DialogInterface dialog, int which);
//which代表items,單選按鈕中的序號

(2)多選按鈕的監聽
public void onClick(DialogInterface dialog, int which, boolean isChecked);
//which代表items,單選按鈕中的序號
//isChecked代表當前點擊的序號是否被勾選

(3)Adapter的監聽
AlertDialog還支持ListAdapter的子類,我們可以傳入各種ListAdapter的子類,來顯示復雜的列表,當然直接使用 setView 也可以辦到
public Builder setAdapter(final ListAdapter adapter, final
OnClickListener listener)

三.ProgressDialog進度對話框


ProgressDialog是AlertDialog類的子類,可以為一個未定義進度的任務顯示一個旋轉輪形狀的進度動畫,或者為一個指定進度的任務顯示一個進度條。它的用處非常廣泛,在每次用戶操作一個延遲的任務時,我們都必須以進度對話框的形式告訴用戶,否者用戶並不知道操作已經開始,可能會多次操作同一個任務,並有可能導致異常發生。

(一)構造方法和常用方法

1.構造方法需要傳入一個上下文
public ProgressDialog(Context context)

2.給定一個樣式,帶進度條和不帶進度條的樣式
public void setProgressStyle(int style) //可選值
//STYLE_SPINNER 默認 圓形,沒有進度條的樣式
//STYLE_HORIZONTAL 給定進度條的樣式

3.設置進度最大值,需要給定STYLE_HORIZONTAL
public void setMax(int max)

4.是否能用返回鍵關閉 true可以關閉,false不能關閉
public void setCancelable(boolean flag)

5.設置一個消息
public void setMessage(CharSequence message)

6.判斷Dialog是否顯示
public boolean isShowing()

7.關閉對話框
public void dismiss()

8.ProgressDialog從AlertDialog中繼承的常用方法setIcon和setTitile

9.雖然ProgressDialog可以設置Button,但是我們一般都不會去使用它

(二)進度對話框的設計的使用

1.圓形進度條對話框

// 顯示圓形的進度框
    public void bt1(View v) {
        // 創建進度條的對話框
        ProgressDialog dialog = new ProgressDialog(this);
        // 設置進度條的樣式,選擇圓形或條狀
        // 這裡這圓形的
        dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        // 設置標題
        dialog.setTitle("文件下載");
        // 設置文本信息
        dialog.setMessage("正在下載。。。");
        // 設置是否能用後退鍵出對話框
        // 選擇false就代表不能
        // 如果設置為false,程序可能退出不了
        dialog.setCancelable(true);
        // 顯示對話框
        dialog.show();
    }

程序運行後的結果:

圓形進度條對話框

這裡點擊進度對話框的其他地方,對話框就消失了。因為默認情況,對話框失去焦點就會消失。

2.條形對話框

// 顯示設置水平的進度框
    public void bt2(View v) {
        // 創建進度條的對話框
        final ProgressDialog dialog = new ProgressDialog(this);
        // 設置進度條的樣式,選擇圓形或條狀
        // 這裡這圓形的
        dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        // 設置標題
        dialog.setTitle("文件下載");
        // 設置文本信息
        dialog.setMessage("正在下載。。。");
        // 設置是否能用後退鍵出對話框
        // 選擇false就代表不能
        // 如果設置為false,程序可能退出不了
        dialog.setCancelable(false);
        // 顯示對話框
        dialog.show();

        // 這裡新建一個線程來,跟新進度和關閉頁面
        new Thread(new Runnable() {

            @Override
            public void run() {
                // 獲取進度值的當前的值
                int index = 0;
                // 跟新進度
                while (index < dialog.getMax()) {
                    index++;
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    // 設置進度的值
                    dialog.setProgress(index);

                }

                // 完成任務後,退出對話框
                dialog.cancel();

            }
        }).start();

    }

運行結果:
水平進度條

這個進度對話框是沒有辦法取消的,因為設置了:dialog.setCancelable(false);
只能等到文件下載完成後對話框自動消失。這個設置在實際應用中也是會有用到的,比如復制文件,不能隨便打斷。本示例中,進度的跟新需要用子線程來更新,進度條的更新可以直接在子線程中實現,而其他布局的跟新是不能在子線程中直接更新的。要使用runOnUIThread();方法來更新主線程的界面,


 

四.時間和日期選擇器對話框

(一)時間和日期對話框的方法

DatePickerDialog與TimePickerDialog都繼承於AlertDialog,基本方法和我們前面講的DatePicker和TimePicker組件一樣,只是需要調用Dialog的show方法來顯示。在構造方法裡需要傳入回調監聽

1.用戶改變時間後的監聽

public interface OnTimeChangedListener { void onTimeChanged(TimePicker view, int hourOfDay, int minute);
}

2.用戶改變日期後的監聽

public interface OnDateChangedListener { void onDateChanged(DatePicker view, int year, int monthOfYear,
int dayOfMonth);
}

(二)時間對話框的使用

// 顯示時間的對話框
    public void btn1(View v) {
        // 第一個參數是上下文
        // 第二個參數是監聽時間選擇後的事件
        // 後面兩個數是默認是時間
        // 後一個是代表是否顯示時間的格式是24小時制的
        TimePickerDialog dialog = new TimePickerDialog(this,
                new OnTimeSetListener() {

                    @Override
                    public void onTimeSet(TimePicker view, int hourOfDay,
                            int minute) {
                        Toast.makeText(MainActivity.this,
                                hourOfDay + "時" + minute + "分", 0).show();

                    }
                }, 21, 8, true);
//顯示標題
        dialog.setTitle("選擇你要設定的時間");
        // 顯示時間的對話框
        dialog.show();

    }


運行後顯示的結果:

時間選擇

這是時間對話框的選擇按鈕,其中也可以設置很多屬性。
這裡點擊完成後會彈出一個選擇的時間的土司。
如圖所示:

時間

(三)日期對話框的使用

// 顯示日期的對話框
    public void btn2(View v) {
        // 第一個參數是上下文
        // 第二個參數是監聽時間選擇後的事件
        // 後面三個數是默認是日期數
        DatePickerDialog dialog = new DatePickerDialog(this,
                new OnDateSetListener() {
                    // 日期選擇器上的月份是從0開始的

                    @Override
                    public void onDateSet(DatePicker view, int year,
                            int monthOfYear, int dayOfMonth) {
                        Toast.makeText(
                                MainActivity.this,
                                year + "年" + (monthOfYear + 1) + "月"
                                        + dayOfMonth + "日", 0).show();

                    }
                }, 2016, 11, 13);
        // 顯示時間的對話框
        dialog.show();

    }

點擊運行後,顯示結果:

日期對話框

上面是日期對話框的默認畫面,也是挺好看的,實際中也可以根據實際需要對它的頁面樣式進行修改。
點擊完成後顯示的結果:

日期結果


總結:
以上就是Android對話框大部分控件的基本使用。
對於有些對話框選擇之後對話框會自動消失,就沒有必要設置ActionButton了
但是有些對話框是不會自動消失的,就需要設置ActionButton或在頁面布局中有可以關掉對話框的控件。
對於有些界面沒有設計得很好看,這個需要自己花時間去慢慢琢磨,這裡只是介紹它們的用法和一些屬性。還有它們的簡單效果。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved