1. 程式人生 > >Android中AlertDialog, AltertDialog.Builder的基本用法與Builder模式

Android中AlertDialog, AltertDialog.Builder的基本用法與Builder模式

1. AltertDialog

Android中到處都是Dialog用來向用戶展示資訊和詢問使用者的選擇。要使用Android的對話方塊非常簡單,只需要使用AlterDialog這個類即可建立一個Android系統提供的標準樣式的Dialog。
標準樣式的Dialog含有一個或者二個或者三個按鈕,可以顯示標題和資訊。
下面是一個最簡單的Dialog的使用的Demo

public class MainActivity extends ActionBarActivity {
    private Button dialogButton;
    private DialogInterface.OnClickListener listener = new
DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { Toast.makeText(MainActivity.this, "Button" + which + "was clicked", Toast.LENGTH_SHORT).show(); } }; @Override protected void onCreate(Bundle savedInstanceState) { super
.onCreate(savedInstanceState); setContentView(R.layout.activity_main); dialogButton = (Button)findViewById(R.id.dialog_button); dialogButton.setOnClickListener(new OnClickListener(){ public void onClick(View v) { AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this
); builder.setTitle("Title"); builder.setMessage("Hello AlertDialog"); builder.setPositiveButton("Positive", listener); builder.setNegativeButton("Negative", listener); builder.setNeutralButton("Neutral", listener); AlertDialog dialog = builder.create(); dialog.show(); /* new AlertDialog.Builder(MainActivity.this) .setTitle("Title") .setMessage("Hello AlertDialog") .setPositiveButton("Positive", listener) .setNegativeButton("Negative", listener) .setNeutralButton("Neutral", listener) .create() .show();*/ } }); } }

上面的示例向我們展示了Android的標準對話方塊的最基本用法。
點選Button,彈出Dialog。
對話方塊的五個基本元素
1. title: 設定Dialog的標題, setTitle(“Title”)。
2. Message: 設定Dialog的內容, setMessage(“Hello AlertDialog”)。
3. Positive Button: 設定Positive Button的文字及其回撥,setPositiveButton(“Positive”, listener)。
4. Neutral Button: 設定Neutral Button的文字及其回撥,setNeutralButton(“Neutral”, listener)
5. Negative: 設定Negative Button的文字及其回撥,setNegativeButton(“Negative”, listener)
執行Demo程式,點選Button,彈出如下對話方塊:
    這裡寫圖片描述

2. AlterDialog的構建者AlterDialog.Builder

在構造AlterDialog的時候,用到了AlterDialog.Builder這個類。首先建立了AlterDialog.Builder類,設定Builder的title,Message,Button及Button回撥。在構建玩Builder類以後,呼叫Builder.Create,正式建立AlterDialog。這是為什麼呢?
我們來看一下AlterDialog.Builder的原始碼,並以最簡單的setTitle為例。
看一下最簡單的

public static class Builder {
    private final AlertController.AlertParams P;
    private int mTheme;

    /**
     * Constructor using a context for this builder and the {@link AlertDialog} it creates.
     */
    public Builder(Context context) {
        this(context, resolveDialogTheme(context, 0));
    }


    public Builder(Context context, int theme) {
        P = new AlertController.AlertParams(new ContextThemeWrapper(
                context, resolveDialogTheme(context, theme)));
        mTheme = theme;
    }

    public Builder setTitle(CharSequence title) {
        P.mTitle = title;
        return this;
    }
    ....
    ....
     public AlertDialog create() {
        final AlertDialog dialog = new AlertDialog(P.mContext, mTheme, false);
        P.apply(dialog.mAlert);
        dialog.setCancelable(P.mCancelable);
        if (P.mCancelable) {
            dialog.setCanceledOnTouchOutside(true);
        }
        dialog.setOnCancelListener(P.mOnCancelListener);
        dialog.setOnDismissListener(P.mOnDismissListener);
        if (P.mOnKeyListener != null) {
            dialog.setOnKeyListener(P.mOnKeyListener);
        }
        return dialog;
    }
}

其中P是一個儲存設定AlterDialog的引數類AlertParams的物件
很顯然,Builder只是將AlterDialog的引數存放在一個引數物件裡,做一個暫時的儲存。
在最後呼叫create方法的時候,建立一個AlterDialog物件,將暫存的引數P一次性應用到這個Dialog物件上。完成Dialog的建立。
我們看到setTitle這樣的函式的返回值是this,返回了本身,所以這樣的函式可以用作連續呼叫。
所以Demo中的

AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); builder.setTitle("Title"); 
builder.setMessage("Hello AlertDialog"); 
builder.setPositiveButton("Positive", listener); 
builder.setNegativeButton("Negative", listener); 
builder.setNeutralButton("Neutral", listener); 
AlertDialog dialog = builder.create(); dialog.show();

可以更簡潔的寫成

new AlertDialog.Builder(MainActivity.this)
    .setTitle("Title")
    .setMessage("Hello AlertDialog")
    .setPositiveButton("Positive", listener)
    .setNegativeButton("Negative", listener)
    .setNeutralButton("Neutral", listener)
    .create()
    .show();

如果我們想要建立一個AlterDialog物件,完全可以直接呼叫AlterDialog的建構函式,或者呼叫AlterDialog為我們提供setTitle,用來做引數設定。為什麼Android要那麼麻煩增加一個Builder類呢?

3 如果沒有AlterDialog.Buidler

AlterDialog有很多的引數,如我們上面列舉的title,message,三個button及其回撥,除此以外還有icon,View等屬性。如果Android不採用Builder,而採用普通的建構函式來設計AlterDialog,可能要寫出很多類似於如下的建構函式:

AlertDialog(String title);
AlertDialog(String message)
AlertDialog(int resId)
AlertDialog(int resId, String title, String message);
AlterDialog(int resId, String title, String message, String PositiveButtonString, OnClickListener listener);
AlterDialog(int resId, String title, String message, String PositiveButtonString, OnClickListener listener);
AlterDialog(int resId, String title, String message, String NegativeButtonString, OnClickListener listener);
AlterDialog(int resId, String title, String message, String PositiveButtonString, OnClickListener listener, String NegativeButtonString, OnClickListener listener);
....

實際上由於AlterDialog的引數眾多,組合眾多,AlterDialog需要很多個建構函式,而且這將隨著AlterDialog的引數的增加而急劇膨脹,最終失去控制。
所以重疊建構函式的方式是可行的,但是會使客戶端的程式碼編寫難度增加,且難以閱讀。比如如下的客戶端程式碼:

AlterDialog dialog = new AlterDialog("hello", "nihao");

如果使用者手邊沒有API手冊,無法記住”hello”和”nihao”,誰是title,誰是message。
那怎麼辦呢?我們可以藉助於Builder模式

4 Builder模式

Builder模式:不直接生成想要的物件,而是讓客戶端利用建構函式構造一個Builder物件,然後客戶端程式碼在Builder上呼叫setter方法,用來設定每個引數。最後呼叫Builder的create方法,生成真正想要的物件。
Builder首先構建了一個最基本的Builder例項,然後提供了一系列setter函式,就像為物件提供具名的可選引數。

AlterDialog.Builder就是Builder模式最好的應用,由於AlterDialog有很多個引數,如果採用建構函式直接構造AlterDialog,會產生建構函式膨脹,也增加了客戶端在編寫AlterDialog的程式碼的時候的難度。所以AlterDialog藉助於其內部類,Builder,首先以最必須的引數(context)構造了一個Builder物件,然後依次呼叫setter(比如setTitle, setMessage….)函式,將AlterDialog的引數暫存起來,最後呼叫create函式,建立一個AlterDialog物件,並將之前暫存的引數一次性應用到該物件上。完成目標物件的建立。

Builder模式有幾個好處:
1. Builder的setter函式可以包含安全檢查,可以確保構建過程的安全,有效。
2. Builder的setter函式是具名函式,有意義,相對於建構函式的一長串函式列表,更容易閱讀維護。
3. 可以利用單個Builder物件構建多個物件,Builder的引數可以在建立物件的時候利用setter函式進行調整

當然Builder模式也有缺點:
1. 更多的程式碼,需要Builder這樣的內部類
2. 增加了類建立的執行時開銷
但是當一個類引數很多的時候,Builder模式帶來的好處要遠勝於其缺點。

相關推薦

AndroidAlertDialog, AltertDialog.Builder基本用法Builder模式

1. AltertDialog Android中到處都是Dialog用來向用戶展示資訊和詢問使用者的選擇。要使用Android的對話方塊非常簡單,只需要使用AlterDialog這個類即可建立一個Android系統提供的標準樣式的Dialog。 標準樣式的D

AndroidGesture手勢的基本用法(總結)

應用場景: (1)左右上下滑動螢幕的事件監聽。比如,上拉彈出自定義的底部佈局之類的,換頁之類的等等。 (2)畫一些不規則的幾何圖形。 執行順序: 1.手指觸碰螢幕時,觸發MotionEvent事件! 2.該事件被OnTouchListener監聽,可在它的onTo

androidmeta-data的基本用法

有時候專案是在寫不出來,就想學點新的知識找點感覺。 我也是網上看到的例子,只是自己去測試了下: 說明:一般的值可以通過value屬性來指定,但是如果要指定一個資源的id,則需要使用resource屬性

Android開發Notification通知欄的基本用法(總結)

1、Notification的基本使用流程 狀態通知欄主要涉及到2個類:Notification 和NotificationManagerNotification:通知資訊類,它裡面對應了通知欄的各個屬性NotificationManager:是狀態列通知的管理類,負責發通知

ElasticSearch的基本用法集群搭建

sage zip alt mob new t catch div 數據類型 聚合 一、簡介 ElasticSearch和Solr都是基於Lucene的搜索引擎,不過ElasticSearch天生支持分布式,而Solr是4.0版本後的SolrCloud才是分布式版本,Sol

在Packet Tracer對交換機的基本配置管理。

交換機 配置與管理 實驗目的: 掌握交換機的配置與管理。實驗準備與目的:<1>在Packet Tracer中用console連接PC與交換機。<2>進入特權模式(en)全局配置模式(conf t)交換機端口視圖模式(int f0/1)<3>Reload重啟(在特權

shell字符串基本用法

前言 blog 字符串比較 註意 boa lai 空格 text 與運算 前言 今天在寫腳本時,發現前階段使用過的一些用法還是需要去百度查找,並且找到的答案還需要自己去篩選,耽誤寫腳本時間,這一篇對字符串之間的比較和邏輯判斷都非常詳細,借鑒他人之作,資源共享。 本片主要說明

c++類public,private,protected的用法區別

1、public修飾的成員變數 在程式的任何地方都可以被訪問,就是公共變數的意思,不需要通過成員函式就可以由類的例項直接訪問 2、private修飾的成員變數 只有類內可直接訪問,私有的,類的例項要通過成員函式才可以訪問,這個可以起到資訊隱藏 3、protected是受保護變數 類內

AndroidAlertDialog的簡單使用

android中彈框很多種,alert框,dialog,AlertDialog,popupwindow,DialogFragment,toast,dialog樣式的activity等等,今天講解AlertDialog的簡單使用。 1 AlertDialog.Builder 設定相關引

【達內課程】Android的GC垃圾回收機制記憶體洩漏

當main()方法執行完,main()方法中的區域性變數都會彈棧,從棧當中銷燬 當左側棧中的e2和e銷燬後,右側中的兩個物件就是垃圾 java底層有一種GC垃圾回收機制,在java程式執行時,GC執行緒會不斷找尋垃圾,是的話會清除掉 當我們點選模擬機的返回鍵時,發生了什麼 當G

AndroidOkHttp使用(包括上傳下載)

OkHttp介紹 OkHttp是Square公司的出品,一個Http請求庫,Google官方文件不推薦人們使用HttpClient,可是HttpURLConnection 實在是太難用了,因此很多人使用了OkHttp 來解決這問題, Andro

Python的CSV模組基本用法

CSV模組提供一種非常便捷的方式操作CSV檔案。本文只是展現最基本的csv檔案的讀寫操作,因為使用的是Python2.7 所以open接受引數少,整個csv讀寫例子如下 import csv fname = 'testcsv.csv' with open(fname,'wb') as

Pythonmatplotlib庫的基本用法

matplotlib庫是Python優秀的資料視覺化第三方庫。它提供了一整套和matlab相似的命令API,十分適合互動式地進行製圖。而且也可以方便地將它作為繪圖控制元件,嵌入GUI應用程式中。matplotlib.pyplot是繪製各類視覺化圖形的命令子庫。 引入matp

c++STL的next_permutation函式基本用法

對於next_permutation函式是針對於排列組合問題的庫函式,它的排序方式是按照字典的方式排列的·: 如以下程式碼對於next_permutation函式的初步解釋: #include<cstdio> #include<cstring> #

AndroidRxJava使用1----基本原理

簡單說就是:一個被觀察者,一個(或多個)觀察者,被觀察者給觀察者發訊息。 具體就是: 1)Observable:被觀察者(主題Subject) 2)Observer/Subscriber :觀察者 3)Subscribe:訂閱(就是被觀察者給觀察者發訊息) Ob

AndroidRxJava使用2----基本使用

1、在build.gradle中新增依賴 compile 'com.jakewharton.rxbinding:rxbinding:0.4.0' 這個依賴包中包含了 rxbinding-0.4.0 (操作控制元件) rxjava-1.1.0 (Java相關的)

call apply 的基本用法區別

知識點:apply為應用的意思, 函式的arguments代指入參 1.基本應用 var a = function () { console.log(this.dog) }; var b = {}; b.dog = 'yyy' a.apply(b) //輸出了y

Android】屬性動畫(基本用法

1、前言 在我們體驗一款APP時,炫酷的動畫往往能讓使用者體驗大幅度提升。想當年我剛學Android的時候,無意中看到蘑菇街購物車的動畫效果,把我給激動得,非要在自己的APP中加入那動畫,記得當時用費了好大的勁...不提了,說多了都是淚... 先了解下,目前可以實現動畫的

AndroidImageSwitcher詳解(注意圖片瀏覽器的區別)

先看看繼承關係,ImageSwitcher和TextSwitcher的繼承關係是一樣的。兩個重要的父類:ViewSwitcher和ViewAnimator 繼承於ViewSwitcher,說明具備了切換功能 繼承於ViewAnimator,說明具備了動畫功能 Image

android泛型方法的用法和作用

舉個例子 首先我的activity中  @Route(path = "/datainit/DataInitActivity") class DataInitActivity: BaseActivity(){ override fun onCreate(savedInstan