Android AlertDialog的一切

AlertDialog是用來和用戶交流互動的很好的工具,善用之能夠爲應用程序增色。有人認爲它簡單」不就一個對話框麼「,我以爲技術是須要嚴謹甚至謙卑。手機屏幕是個寸土必爭之地,那麼既然點進來看此文了,說明仍是對AlertDialog想了解更多的好學人士。此文的目標:再也不搜索」Android AlertDialog「!
java

先來看一個最簡單的AlertDialog:android

其實,我以爲這個最基本的AlertDialog已經足夠好看的了。下面是實現代碼:ide

/** AlertDialog.Builder 是用來建立AlertDialog的 */
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder//給builder set各類屬性值
    .setIcon(R.drawable.blink)//繼續set
    .setMessage(getString(R.string.alert_dialog_message))
    .setPositiveButton("肯定退出", new OnClickListener() {//肯定按鈕
        @Override
        public void onClick(DialogInterface dialog, int which) {
            MainActivity.this.finish();
            System.exit(0);
        }
    })
    .setNegativeButton("我按錯了", new OnClickListener() {//取消按鈕
        @Override
        public void onClick(DialogInterface dialog, int which) {
            dialog.dismiss();
        }
    })
    .show();//顯示AlertDialog

這裏,也許會奇怪,爲何沒有直接見到AlertDialog呢?而是用了一個Builder,set了一些值以後直接.show()就出來了?
函數

若是有這麼濃厚的好奇心,仍是要看一下AlertDialog的源碼:工具

public class AlertDialog extends Dialog implements DialogInterface

首先AlertDialog繼承自Dialog實現了DialogInterface接口,那麼使用的時候也能夠考慮用一下Dialog的函數。佈局

protected AlertDialog(Context context)

構造方法都是用protected來修飾的,說明咱們沒有辦法直接new AlertDialog(),Google給咱們提供了一個AlertDialog的內部類AlertDialog.Builder來實現:ui

public static class Builder

很欣喜的看到public修飾符了,這也就是上文使用AlertDialog.Builder的緣由。this


對於AlertDialog.Builder的理解,從字面上看出,它是用來構建AlertDialog的,能夠歸納一下,它是爲AlertDialog作一些準備工做的。下面咱們來看看AlertDialog對象的使用,仍是先看效果,這纔有興趣往下看吶:
spa

代碼只是略加改動,體現了AlertDialog對象的做用:xml

/** AlertDialog.Builder 是用來建立AlertDialog的 */
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
AlertDialog alertDialog =
        builder//給builder set各類屬性值
            .setIcon(R.drawable.blink)//繼續set
            .setTitle(getString(R.string.alert_dialog_message))
            .setMessage(getString(R.string.alert_dialog_message))
            .setPositiveButton("肯定退出", new OnClickListener() {//肯定按鈕
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    MainActivity.this.finish();
                    System.exit(0);
                }
            })
            .setNegativeButton("我按錯了", new OnClickListener() {//取消按鈕
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();
                }
            })
            .create();//建立AlertDialog對象
alertDialog.setMessage("AlertDialog對象:\n\t\t" + getString(R.string.alert_dialog_message));
alertDialog.show();


自定義AlertDialog,我以爲效果還不如默認的好:

佈局文件alert_dialog_custom.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >
    <TextView
        android:id="@+id/alert_dialog_message"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/alert_dialog_message"
        android:drawableLeft="@drawable/blink"
        android:gravity="center_vertical"
        />
    <Button
        android:id="@+id/alert_dialog_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/more"
        android:text="@string/alert_dialog_btn"/>
</LinearLayout>

使用自定義佈局很簡單:

builder.setView(LayoutInflater.from(MainActivity.this).inflate(R.layout.alert_dialog_custom, null));

AlertDialog.Builder提供了setView的方法來使用自定義佈局。


AlertDialog.Builder的setView方法是在AlertDialog的Message下面提供了一個自定義佈局的空間,並不能改變整個AlertDialog的風格。下面請看改變總體風格的AlertDialog:

佈局文件能夠本身任意發揮,主要仍是看:

AlertDialog alertDialog = new AlertDialog.Builder(MainActivity.this).create();//Builder直接create成AlertDialog
alertDialog.show();//AlertDialog先得show出來,才能獲得其Window
Window window = alertDialog.getWindow();//獲得AlertDialog的Window
window.setContentView(R.layout.alert_dialog_custom);//給Window設置自定義佈局
View layout = LayoutInflater.from(MainActivity.this).inflate(R.layout.alert_dialog_custom, null);//從xml中inflate過來
TextView dialogMsg = (TextView) window.findViewById(R.id.alert_dialog_message);//從Window中findView
dialogMsg.setOnClickListener(new View.OnClickListener() {//設置監聽
    @Override
    public void onClick(View v) {
        MainActivity.this.finish();
        System.exit(0);
    }
});


關於AlertDialog,我想到的就這麼多了,拋磚引玉。

相關文章
相關標籤/搜索