1. 程式人生 > >Android彈出對話方塊--Alertdialog(系統自帶的)

Android彈出對話方塊--Alertdialog(系統自帶的)

一.

我們在平時做開發的時候,免不了會用到各種各樣的對話方塊,相信有過其他平臺開發經驗的朋友都會知道,大部分的平臺都只提供了幾個最簡單的實現,如果我們想實現自己特定需求的對話方塊,大家可能首先會想到,通過繼承等方式,重寫我們自己的對話方塊。當然,這也是不失為一個不錯的解決方式,但是一般的情況卻是這樣,我們重寫的對話方塊,也許只在一個特定的地方會用到,為了這一次的使用,而去建立一個新類,往往有點殺雞用牛刀的感覺,甚至會對我們的程式增加不必要的複雜性,對於這種情形的對話方塊有沒有更優雅的解決方案呢? 

    幸運的是,android提供了這種問題的解決方案,剛開始接觸android的時候,我在做一個自定義對話方塊的時候,也是通過繼承的方式來實現,後來隨著對文件瞭解的深入,發現了android其實已經提供了相應的介面Dialog Builder(系統自帶) ,下面我就把相關的內容在這裡分享一下,也能讓更多的初學者少走彎路。

二.AlertDialog相關知識點:

我們看到,Dialog有很多的子類實現,所以我們要定義一個對話方塊,使用其子類來例項化一個即可,而不要直接使用Dialog這個父類來構造。

今天我們重點要來了解的就是AlertDialog對話方塊,我們看到,AlertDialog是Dialog的一個直接子類。使用AlertDialog,我們可以顯示一個標題,最多3個按鈕操作,以及一組選擇框或者是自己定義的彈出框。

2.1這裡借用android的官方文件提供的一個圖來看看AlertDialog框的組成:

①區域1那裡就是定義彈出框的頭部資訊,包括標題名或者是一個圖示。

②區域2那裡是AlertDialog對話方塊的content部分,在這裡我們可以設定一些message資訊,或者是定義一組選擇框,還可以定義我們自己的佈局彈出框。

③區域3那裡使我們的Action Buttons部分,這裡我們可以定義我們的操作按鈕。

2.2說到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)
這個是相當於一個忽略操作的按鈕。

我們每一種action buttons最多隻能出現一個,即彈出對話方塊最多隻能出現一個PositiveButton。

三.常用的幾種AlertDialog對話方塊

3.1.彈出一個警告框,並有三個按鈕可選擇

程式碼部分:

button.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                //    通過AlertDialog.Builder這個類來例項化我們的一個AlertDialog的物件
                AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
                //    設定Title的圖示
                builder.setIcon(R.drawable.ic_launcher);
                //    設定Title的內容
                builder.setTitle("彈出警告框");
                //    設定Content來顯示一個資訊
                builder.setMessage("確定刪除嗎?");
                //    設定一個PositiveButton
                builder.setPositiveButton("確定", new DialogInterface.OnClickListener()
                {
                    @Override
                    public void onClick(DialogInterface dialog, int which)
                    {
                        Toast.makeText(MainActivity.this, "positive: " + which, Toast.LENGTH_SHORT).show();
                    }
                });
                //    設定一個NegativeButton
                builder.setNegativeButton("取消", new DialogInterface.OnClickListener()
                {
                    @Override
                    public void onClick(DialogInterface dialog, int which)
                    {
                        Toast.makeText(MainActivity.this, "negative: " + which, Toast.LENGTH_SHORT).show();
                    }
                });
                //    設定一個NeutralButton
                builder.setNeutralButton("忽略", new DialogInterface.OnClickListener()
                {
                    @Override
                    public void onClick(DialogInterface dialog, int which)
                    {
                        Toast.makeText(MainActivity.this, "neutral: " + which, Toast.LENGTH_SHORT).show();
                    }
                });
                //    顯示出該對話方塊
                builder.show();
            }
        });

我們如果要建立一個AlertDialog對話方塊,需要使用AlertDialog的一個內部類,即AlertDialog.Builder來構建一個AlertDialog的對話方塊,然後通過setXX方法來設定我們想要顯示的內容即可。

我們看到,我們一共設定了3個action buttons,每一個button都為其綁定了一個 DialogInterface.OnClickListener() 的監聽事件,然後在裡面通過Toast吐司對話方塊(這個在後面隨筆中會講解)來彈出一下我們的一些資訊,which方法表示的是action button所代表的int值:

positive:  -1
negative:  -2
neutral:  -3

我們可以知道,which=-1就表示點選的是確定按鈕,-2表示點選的是取消按鈕,-3表示點選的是忽略按鈕。

3.2下拉列表彈出框

程式碼部分:

button2.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View arg0)
            {
                AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
                builder.setIcon(R.drawable.ic_launcher);
                builder.setTitle("選擇一個城市");
                //    指定下拉列表的顯示資料
                final String[] cities = {"廣州", "上海", "北京", "香港", "澳門"};
                //    設定一個下拉的列表選擇項
                builder.setItems(cities, new DialogInterface.OnClickListener()
                {
                    @Override
                    public void onClick(DialogInterface dialog, int which)
                    {
                        Toast.makeText(MainActivity.this, "選擇的城市為:" + cities[which], Toast.LENGTH_SHORT).show();
                    }
                });
                builder.show();
            }
        });

在這裡我們通過 setItems(CharSequence[] items, DialogInterface.OnClickListener listener) 方法來設定我們的一個下拉列表框。注意:因為下拉列表框或者是下拉多選框這些都是顯示在Content中的,所以message和下拉列表框這些是不能夠同時存在的

我們也可以給其繫結一個DialogInterface.OnClickListener監聽器,當選中一個選項時,對話方塊就會消失掉。這裡的which代表的是下拉列表的每個選項的索引,通過這個我們可以輕鬆得到使用者選中的是哪一個選項。

bubuko.com,布布扣

3.3彈出一個下拉單選框

程式碼部分:

button3.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
                builder.setIcon(R.drawable.ic_launcher);
                builder.setTitle("請選擇性別");
                final String[] sex = {"男", "女", "未知性別"};
                //    設定一個單項選擇下拉框
                /**
                 * 第一個引數指定我們要顯示的一組下拉單選框的資料集合
                 * 第二個引數代表索引,指定預設哪一個單選框被勾選上,1表示預設‘女‘ 會被勾選上
                 * 第三個引數給每一個單選項繫結一個監聽器
                 */
                builder.setSingleChoiceItems(sex, 1, new DialogInterface.OnClickListener()
                {
                    @Override
                    public void onClick(DialogInterface dialog, int which)
                    {
                        Toast.makeText(MainActivity.this, "性別為:" + sex[which], Toast.LENGTH_SHORT).show();
                    }
                });
                builder.setPositiveButton("確定", new DialogInterface.OnClickListener()
                {
                    @Override
                    public void onClick(DialogInterface dialog, int which)
                    {
                        
                    }
                });
                builder.setNegativeButton("取消", new DialogInterface.OnClickListener()
                {
                    @Override
                    public void onClick(DialogInterface dialog, int which)
                    {
                        
                    }
                });
                builder.show();
            }
        });

注意在彈出下拉單選框時,當我們選中一個選項,對話方塊是不會消失的,我們需要點選action button才能讓對話方塊消失

bubuko.com,布布扣


3.4.彈出一個下拉多選框

程式碼部分:

button4.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
                builder.setIcon(R.drawable.ic_launcher);
                builder.setTitle("愛好");
                final String[] hobbies = {"籃球", "足球", "網球", "斯諾克"};
                //    設定一個單項選擇下拉框
                /**
                 * 第一個引數指定我們要顯示的一組下拉多選框的資料集合
                 * 第二個引數代表哪幾個選項被選擇,如果是null,則表示一個都不選擇,如果希望指定哪一個多選選項框被選擇,
                 * 需要傳遞一個boolean[]陣列進去,其長度要和第一個引數的長度相同,例如 {true, false, false, true};
                 * 第三個引數給每一個多選項繫結一個監聽器
                 */
                builder.setMultiChoiceItems(hobbies, null, new DialogInterface.OnMultiChoiceClickListener()
                {
                    StringBuffer sb = new StringBuffer(100);
                    @Override
                    public void onClick(DialogInterface dialog, int which, boolean isChecked)
                    {
                        if(isChecked)
                        {
                            sb.append(hobbies[which] + ", ");
                        }
                        Toast.makeText(MainActivity.this, "愛好為:" + sb.toString(), Toast.LENGTH_SHORT).show();
                    }
                });
                builder.setPositiveButton("確定", new DialogInterface.OnClickListener()
                {
                    @Override
                    public void onClick(DialogInterface dialog, int which)
                    {
                        
                    }
                });
                builder.setNegativeButton("取消", new DialogInterface.OnClickListener()
                {
                    @Override
                    public void onClick(DialogInterface dialog, int which)
                    {
                        
                    }
                });
                builder.show();
            }
        });

我們看到在設定下拉多選框時使用的是setMultiChoiceItems方法,其各個引數的含義,在上面程式碼中已經闡述了。
同樣,對於下拉多選框,當我們選中其中一個選項時,對話方塊是不會消失的,只有點選了action button才會消失

bubuko.com,布布扣

3.5.自定義彈出對話方塊(內容部分自定義)

對於自定義彈出對話方塊,我們就需要自己指定一個自定義的佈局檔案了,我們就給出一個最簡單的輸入使用者名稱和密碼的兩個EditText:

dialog.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    
    <EditText 
        android:id="@+id/username"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="username"/>
    
    <EditText
        android:id="@+id/password"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/username"
        android:hint="password"
        android:inputType="textPassword"/>

</RelativeLayout>



程式碼部分:

button5.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
                builder.setIcon(R.drawable.ic_launcher);
                builder.setTitle("請輸入使用者名稱和密碼");
                //    通過LayoutInflater來載入一個xml的佈局檔案作為一個View物件
                View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.dialog, null);
                //    設定我們自己定義的佈局檔案作為彈出框的Content
                builder.setView(view);
                
                final EditText username = (EditText)view.findViewById(R.id.username);
                final EditText password = (EditText)view.findViewById(R.id.password);
                
                builder.setPositiveButton("確定", new DialogInterface.OnClickListener()
                {
                    @Override
                    public void onClick(DialogInterface dialog, int which)
                    {
                        String a = username.getText().toString().trim();
                        String b = password.getText().toString().trim();
                        //    將輸入的使用者名稱和密碼打印出來
                        Toast.makeText(MainActivity.this, "使用者名稱: " + a + ", 密碼: " + b, Toast.LENGTH_SHORT).show();
                    } 
                });
                builder.setNegativeButton("取消", new DialogInterface.OnClickListener()
                {
                    @Override
                    public void onClick(DialogInterface dialog, int which)
                    {
                        
                    }
                });
                builder.show();
            }
        });

我們看到,通過自定義彈出框,我們首先需要寫一個xml的佈局檔案,然後在裡面定義我們的佈局,我們不需要在佈局檔案裡定義Button按鈕,可以通過 AlertDialog.Builder 來設定 action buttons。

通過 View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.dialog, null); 我們可以將我們的佈局檔案載入進來,得到一個View物件,然後通過 AlertDialog.Builder 的setView方法來設定我們的自定義彈出框

bubuko.com,布布扣

轉載地址:http://www.mamicode.com/info-detail-96206.html