1. 程式人生 > >安卓Dialog彈窗詳解

安卓Dialog彈窗詳解

樣式一:簡單對話方塊 在這裡插入圖片描述

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(); } });

which表示的是action button所代表的int值,which=-1就表示點選的是確定按鈕,-2表示點選的是取消按鈕,-3表示點選的是忽略按鈕。 樣式二:列表對話方塊 在這裡插入圖片描述

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();
            }
        });

當選中一個選項時,對話方塊就會消失掉。這裡的which代表的是下拉列表的每個選項的索引,通過這個我們可以輕鬆得到使用者選中的是哪一個選項。 樣式三:單選對話方塊 在這裡插入圖片描述

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才能讓對話方塊消失。

樣式四:複選對話方塊

在這裡插入圖片描述

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();
            }
        });

同樣,對於下拉多選框,當我們選中其中一個選項時,對話方塊是不會消失的,只有點選了action button才會消失。

樣式五:內容部分自定義的對話方塊

在這裡插入圖片描述

<?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();
            }
        });

樣式六:完全自定義的對話方塊

1,首先我們需要自定義Dialog的style,讓他自己本有的東西全部透明,然後在設定我們自己的內容就可以達到完全自定義的效果了

<!--對話方塊的樣式-->
    <style name="NormalDialogStyle">
        <!--對話方塊背景 -->
        <item name="android:windowBackground">@android:color/transparent</item>
        <!--邊框 -->
        <item name="android:windowFrame">@null</item>
        <!--沒有標題 -->
        <item name="android:windowNoTitle">true</item>
        <!-- 是否浮現在Activity之上 -->
        <item name="android:windowIsFloating">true</item>
        <!--背景透明 -->
        <item name="android:windowIsTranslucent">false</item>
        <!-- 是否有覆蓋 -->
        <item name="android:windowContentOverlay">@null</item>
        <!--進出的顯示動畫 -->
        <item name="android:windowAnimationStyle">@style/normalDialogAnim</item>
        <!--背景變暗-->
        <item name="android:backgroundDimEnabled">true</item>
    </style>
    <!--對話方塊動畫-->
    <style name="normalDialogAnim" parent="android:Animation">
        <item name="@android:windowEnterAnimation">@anim/normal_dialog_enter</item>
        <item name="@android:windowExitAnimation">@anim/normal_dialog_exit</item>
    </style>

進入動畫:

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

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:fromYDelta="100%"
        android:toYDelta="0"
        android:fillAfter="false"
        android:duration="300"
        />

    </set>

離開動畫:

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

<set xmlns:android="http://schemas.android.com/apk/res/android">
   <translate 
        android:fromYDelta="0"
        android:toYDelta="100%"
        android:fillAfter="false"
        android:duration="300"   
        />
    </set>

2,接下來就可以為對話方塊設定我們自定義的style了

/**
     * 自定義對話方塊
     */
    private void customDialog() {
        final Dialog dialog = new Dialog(this, R.style.NormalDialogStyle);
        View view = View.inflate(this, R.layout.dialog_normal, null);
        TextView cancel = (TextView) view.findViewById(R.id.cancel);
        TextView confirm = (TextView) view.findViewById(R.id.confirm);
        // 設定自定義的佈局
        dialog.setContentView(view);
        //使得點選對話方塊外部不消失對話方塊
        dialog.setCanceledOnTouchOutside(true);
        //設定對話方塊的大小
        view.setMinimumHeight((int) (ScreenSizeUtils.getInstance(this).getScreenHeight() * 0.23f));
        Window dialogWindow = dialog.getWindow();
        WindowManager.LayoutParams lp = dialogWindow.getAttributes();
        lp.width = (int) (ScreenSizeUtils.getInstance(this).getScreenWidth() * 0.75f);
        lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
        lp.gravity = Gravity.CENTER;
        dialogWindow.setAttributes(lp);
        cancel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dialog.dismiss();
            }
        });
        confirm.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dialog.dismiss();
            }
        });
        dialog.show();
    }

將Dialog放置在螢幕中間lp.gravity = Gravity.CENTER;並設定他的寬度為螢幕的75%lp.width = (int) (ScreenSizeUtils.getInstance(this).getScreenWidth() * 0.75f); 3,這裡使用到了一個工具類用來計算手機螢幕的寬高,如下程式碼:

public class ScreenSizeUtils {
    private static ScreenSizeUtils instance = null;
    private int screenWidth, screenHeight;

    public static ScreenSizeUtils getInstance(Context mContext) {
        if (instance == null) {
            synchronized (ScreenSizeUt