Android UI系列-----Dialog對話框

您能夠經過點擊 右下角 的按鈕 來對文章內容做出評價, 也能夠經過左下方的 關注按鈕 來關注個人博客的最新動態。 

若是文章內容對您有幫助, 不要忘記點擊右下角的 推薦按鈕 來支持一下哦   

若是您對文章內容有任何疑問, 能夠經過評論或發郵件的方式聯繫我: 501395377@qq.com  / lzp501395377@gmail.com

若是須要轉載,請註明出處,謝謝!!

在Android開發當中,在界面上彈出一個Dialog對話框使咱們常常須要作的,本篇隨筆將詳細的講解Dialog對話框這個概念,包括定義不一樣樣式的對話框。java

1、Dialogandroid

咱們首先來看看android官方文檔對Dialog的介紹數組

A dialog is a small window that prompts the user to make a decision or enter additional information. A dialog does not fill the screen and is normally used for modal events that require users to take an action before they can proceed.

dialog就是一個在屏幕上彈出一個可讓用戶作出一個選擇,或者輸入額外的信息的對話框,一個對話框並不會沾滿咱們整個的屏幕,而且一般用於模型事件當中須要用戶作出一個決定後纔會繼續執行。app

Dialog類是dialog對話框的基類,可是咱們應該避免直接使用這個類來實例化一個dialog對話框,咱們應當使用其子類來獲得一個對話框:ide

java.lang.Object
   ↳     android.app.Dialog
Known Direct Subclasses AlertDialog, CharacterPickerDialog, MediaRouteChooserDialog, MediaRouteControllerDialog, Presentation
Known Indirect Subclasses DatePickerDialog, ProgressDialog, TimePickerDialog

咱們看到,Dialog有不少的子類實現,因此咱們要定義一個對話框,使用其子類來實例化一個便可,而不要直接使用Dialog這個父類來構造。佈局

2、AlertDialog學習

今天咱們重點要來了解的就是AlertDialog對話框,咱們看到,AlertDialog是Dialog的一個直接子類。ui

使用AlertDialog,咱們能夠顯示一個標題,最多3個按鈕操做,以及一組選擇框或者是本身定義的彈出框。this

這裏借用android的官方文檔提供的一個圖來看看AlertDialog框的組成:spa

①區域1那裏就是定義彈出框的頭部信息,包括標題名或者是一個圖標。

②區域2那裏是AlertDialog對話框的content部分,在這裏咱們能夠設置一些message信息,或者是定義一組選擇框,還能夠定義咱們本身的佈局彈出框。

③區域3那裏使咱們的Action Buttons部分,這裏咱們能夠定義咱們的操做按鈕。

說到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對話框。

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表示點擊的是忽略按鈕。

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表明的是下拉列表的每一個選項的索引,經過這個咱們能夠輕鬆獲得用戶選中的是哪個選項。

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才能讓對話框消失

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纔會消失

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方法來設置咱們的自定義彈出框

 

總結:到這裏,基本上將AlertDialog詳細的講解完了,本篇隨筆主要講解了Dialog彈出框的基本概念以及詳細講解了AlertDialog這個彈出框,包括定義一個基本的彈出警告框、下拉列表框、下拉多選框等等。後續的隨筆將會繼續記錄學習Android的點點滴滴。

相關文章
相關標籤/搜索