AlertDialog的用法

一、AlertDialog的介紹

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

  Activities提供了一種方便管理的創建、保存、回覆的對話框機制,例如 onCreateDialog(int), onPrepareDialog(int, Dialog), showDialog(int), dismissDialog(int)等方法,如果使用這些方法的話,Activity將通過getOwnerActivity()方法返回該Activity管理的對話框(dialog).

  onCreateDialog(int):當你使用這個回調函數時,Android系統會有效的設置這個Activity爲每個對話框的所有者,從而自動管理每個對話框的狀態並掛靠到Activity上。這樣,每個對話框繼承這個Activity的特定屬性。比如,當一個對話框打開時,菜單鍵顯示爲這個Activity定義的選項菜單,音量鍵修改Activity使用的音頻流。

  showDialog(int): 當你想要顯示一個對話框時,調用showDialog(int id) 方法並傳遞一個唯一標識這個對話框的整數。當對話框第一次被請求時,Android從你的Activity中調用onCreateDialog(int id),你應該在這裏初始化這個對話框Dialog。這個回調方法被傳以和showDialog(int id)相同的ID。當你創建這個對話框後,在Activity的最後返回這個對象。

  onPrepareDialog(int, Dialog):在對話框被顯示之前,Android還調用了可選的回調函數onPrepareDialog(int id, Dialog). 如果你想在每一次對話框被打開時改變它的任何屬性,你可以定義這個方法。這個方法在每次打開對話框時被調用,而onCreateDialog(int) 僅在對話框第一次打開時被調用。如果你不定義onPrepareDialog(),那麼這個對話框將保持和上次打開時一樣。這個方法也被傳遞以對話框的ID,和在onCreateDialog()中創建的對話框對象。

  dismissDialog(int):當你準備關閉對話框時,你可以通過對這個對話框調用dismiss()來消除它。如果需要,你還可以從這個Activity中調用dismissDialog(int id) 方法,這實際上將爲你對這個對話框調用dismiss() 方法。 如果你想使用onCreateDialog(int id) 方法來管理你對話框的狀態(就如同在前面的章節討論的那樣),然後每次你的對話框消除的時候,這個對話框對象的狀態將由該Activity保留。如果你決定不再需要這個對象或者清除該狀態是重要的,那麼你應該調用removeDialog(int id)。這將刪除任何內部對象引用而且如果這個對話框正在顯示,它將被消除。

二、AlertDialog對話框的創建

  AlertDialog對話框主要包括:普通對話框、列表對話框、單選對話框和多選對話框。
  
  代碼如下:

package com.danny_jiang.day10_dialog;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.DialogInterface.OnMultiChoiceClickListener;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
/**
 * 普通對話框、列表對話框、單選對話框、多選對話框
 * @author Administrator
 *
 */
public class MainActivity extends Activity {

    private int position = -1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    /**
     * 所有的AlertDialog統統都是通過Builder去構建的
     */
    public void click(View view) {
        switch (view.getId()) {
        case R.id.alertDialog:
            // 初始化Builder對象
            AlertDialog.Builder builder1 = new AlertDialog.Builder(this);

            // 通過Builder設置對話框的title標題和message內容、以及圖標
            builder1.setTitle("殘忍卸載");
            builder1.setMessage("真的要卸載嗎 T_T");
            builder1.setIcon(R.drawable.ic_launcher);

            // 設置爲false說明當前dialog是不能用返回鍵取消的(默認爲true)
            builder1.setCancelable(false);

            // 設置"堅持卸載"按鈕
            builder1.setPositiveButton("堅持卸載", new OnClickListener() {

                /**
                 * 當點擊對話框中某一item時,此方法被調用
                 * 
                 * @param which 是系統中確認按鈕所對應的位置
                 */
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Toast.makeText(MainActivity.this, "點擊了卸載按鈕 which is" + which, 
                            Toast.LENGTH_SHORT).show();
                }
            });

            // 設置"取消卸載"按鈕
            builder1.setNegativeButton("取消卸載", new OnClickListener() {

                //此時的which是取消按鈕的位置,由系統決定
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Toast.makeText(MainActivity.this, "點擊了取消按鈕 + which is " + which, 
                            Toast.LENGTH_SHORT).show();
                }
            });

            // 設置"查看詳情"按鈕
            builder1.setNeutralButton("查看詳情", new OnClickListener() {

                //此時的which是查看詳情的位置,由系統決定
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Toast.makeText(MainActivity.this, "點擊了查看詳情+ which is " + which, 
                            Toast.LENGTH_SHORT).show();
                }
            });

            // 通過Builder.show方法顯示對話框
            builder1.show();
            //AlertDialog dialog = builder1.create();
            //dialog.show();
            break;

        case R.id.listDialog:
            Builder builder2 = new Builder(this);

            builder2.setTitle("作詩一首");

            final String[] arr = getResources().getStringArray(R.array.poet);

            //通過setItems設置爲列表對話框樣式
            builder2.setItems(arr, new OnClickListener() {

                //此參數中的which是顯示列表的item位置信息,從0開始
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Toast.makeText(MainActivity.this, "您喜歡 " + arr[which], 
                            Toast.LENGTH_SHORT).show();
                }
            });

            builder2.show();
            break;

        case R.id.singleDialog:
            Builder builder3 = new Builder(this);

            builder3.setTitle("作詩一首");
            final String[] arr2 = getResources().getStringArray(R.array.arr);
            /**
             * 通過Builder.setSingleChoiceItems方法設置單選對話框樣式
             * 1參數  所需要顯示的列表內容
             * 2參數  默認選中item的位置,從0開始。如果設置爲-1,則無選中項
             * 3參數  item選中的監聽器
             */
            builder3.setSingleChoiceItems(arr2, -1, new OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    position = which;
                }
            });

            builder3.setNegativeButton("Cancel", null);
            builder3.setPositiveButton("OK", new OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    String content = arr2[position];
                    Toast.makeText(MainActivity.this, "點擊了 " + content, 
                            Toast.LENGTH_SHORT).show();
                }
            });

            builder3.show();
            break;

        case R.id.multiDialog:
            Builder builder4 = new Builder(this);

            builder4.setTitle("選中的興趣愛好");
            final String[] arr3 = getResources().getStringArray(R.array.arr2);
            //創建boolean數組,長度跟字符串長度一致,保存有哪些item處於選中狀態
            final boolean[] checkedPos = new boolean[arr3.length];
            final StringBuilder sBuilder = new StringBuilder();

            builder4.setMultiChoiceItems(arr3, null, new OnMultiChoiceClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which, boolean isChecked) {
                    android.util.Log.e("danny", "which is " + which + 
                            "isChecked is " + isChecked);
                    checkedPos[which] = isChecked;
                }
            });
            builder4.setPositiveButton("OK", new OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    for(int i = 0; i < checkedPos.length; i++) {
                        if(checkedPos[i]) {
                            sBuilder.append(arr3[i] + "\n");
                        }
                    }

                    String content = sBuilder.toString();
                    Toast.makeText(MainActivity.this, content, 1000).show();
                }
            });

            builder4.show();
            break;

        default:
            break;
        }
    }
}

佈局文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="${relativePackage}.${activityClass}" >

    <Button
        android:id="@+id/alertDialog"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="click"
        android:text="普通對話框" />

    <Button
        android:id="@+id/listDialog"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="click"
        android:text="列表對話框" />

    <Button
        android:id="@+id/singleDialog"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="click"
        android:text="單選對話框" />

    <Button
        android:id="@+id/multiDialog"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="click"
        android:text="多選對話框" />

</LinearLayout>

strings.xml文件:

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

    <string name="app_name">Day10_Dialog</string>
    <string name="hello_world">Hello world!</string>

    <string-array name="poet">
        <item>牀前明月光</item>
        <item>我爸是李剛</item>
        <item>不識廬山真面目</item>
        <item>只識彎弓射大雕</item>
    </string-array>
    <string-array name="arr">
        <item>十年生死兩茫茫</item>
        <item>一樹梨花壓海棠</item>
        <item>天蒼蒼,野茫茫</item>
        <item>一樹梨花壓海棠</item>
    </string-array>
    <string-array name="arr2">
        <item>在天願做比翼鳥</item>
        <item>大難臨頭各自飛</item>
        <item>老夫療法少年狂</item>
        <item>青春作伴好還鄉</item>
    </string-array>

</resources>

效果圖如下:
普通對話框
這裏寫圖片描述

列表對話框
這裏寫圖片描述

單選對話框
這裏寫圖片描述

多選對話框
這裏寫圖片描述

三、自定義View的AlertDialog

  有時候系統自帶的AlertDialog風格不能滿足我們的需求,就比如說我們要實現一個Login畫面,有用戶名和密碼,這時我們就要用到自定義View的AlertDialog

  1、先創建自定義登錄框的佈局文件my_login_view.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:padding="5dp" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="賬號:" />

        <EditText
            android:id="@+id/account"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:padding="5dp" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="密碼:" />

        <EditText
            android:id="@+id/password"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:inputType="numberPassword" />
    </LinearLayout>

</LinearLayout>

  2、在Activity的合適地方創建自定義的AlertDialog(比如按鈕的點擊事件中):

package com.vince.login_dialog;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void click(View view) {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        LayoutInflater inflater = LayoutInflater.from(this);
        final View myLoginView = inflater.inflate(R.layout.login_layout, null);

        builder.setView(myLoginView);
        builder.setTitle("用戶登錄");
        builder.setPositiveButton("確定", new OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {
                EditText account = (EditText) myLoginView
                        .findViewById(R.id.account);
                EditText password = (EditText) myLoginView
                        .findViewById(R.id.password);
                String acc = account.getText().toString();
                String pass = password.getText().toString();
                Toast.makeText(MainActivity.this, "賬號:" + acc + " 密碼:" + pass,
                        Toast.LENGTH_LONG).show();
            }
        });

        builder.setNegativeButton("取消", new OnClickListener() {

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

            }
        });
        builder.show();
    }
}

效果圖如下:
這裏寫圖片描述

四、自定義Adapter的AlertDialog

代碼如下:

package com.vince.dialog_adapter;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.os.Bundle;
import android.view.View;
import android.widget.SimpleAdapter;
import android.widget.Toast;

public class MainActivity extends Activity {

    // 數據源
    private List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
    private SimpleAdapter adapter;
    private AlertDialog dialog;// 對話框

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 初始化適配器
        initAdapter();
    }

    /**
     * 初始化適配器
     */
    private void initAdapter() {
        for (int i = 0; i < 10; i++) {
            Map<String,Object> map=new HashMap<String, Object>();
            map.put("name", "Android-"+i);
            map.put("count", i);
            list.add(map);
        }
        adapter = new SimpleAdapter(this, list,android.R.layout.simple_list_item_2,
                new String[]{"name","count"},
                new int[]{android.R.id.text1,android.R.id.text2});
    }

    public void click(View view) {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        dialog = builder.setTitle("自定義適配器").setIcon(R.drawable.ic_launcher)
                .setAdapter(adapter, new OnClickListener() {

                    public void onClick(DialogInterface dialog, int which) {
                        Toast.makeText(MainActivity.this,
                                "選中了" + list.get(which).get("name"),
                                Toast.LENGTH_LONG).show();
                    }
                }).create();
        dialog.show();
    }
}

效果圖如下:
這裏寫圖片描述
更多有關AlertDialog的介紹,見http://blog.csdn.net/ameyume/article/details/6138488
http://www.cnblogs.com/jiayongji/p/5371996.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章