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模式帶來的好處要遠勝於其缺點。
相關推薦
Android中AlertDialog, AltertDialog.Builder的基本用法與Builder模式
1. AltertDialog Android中到處都是Dialog用來向用戶展示資訊和詢問使用者的選擇。要使用Android的對話方塊非常簡單,只需要使用AlterDialog這個類即可建立一個Android系統提供的標準樣式的Dialog。 標準樣式的D
Android中Gesture手勢的基本用法(總結)
應用場景: (1)左右上下滑動螢幕的事件監聽。比如,上拉彈出自定義的底部佈局之類的,換頁之類的等等。 (2)畫一些不規則的幾何圖形。 執行順序: 1.手指觸碰螢幕時,觸發MotionEvent事件! 2.該事件被OnTouchListener監聽,可在它的onTo
android中meta-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是受保護變數 類內
Android中AlertDialog的簡單使用
android中彈框很多種,alert框,dialog,AlertDialog,popupwindow,DialogFragment,toast,dialog樣式的activity等等,今天講解AlertDialog的簡單使用。 1 AlertDialog.Builder 設定相關引
【達內課程】Android中的GC垃圾回收機制與記憶體洩漏
當main()方法執行完,main()方法中的區域性變數都會彈棧,從棧當中銷燬 當左側棧中的e2和e銷燬後,右側中的兩個物件就是垃圾 java底層有一種GC垃圾回收機制,在java程式執行時,GC執行緒會不斷找尋垃圾,是的話會清除掉 當我們點選模擬機的返回鍵時,發生了什麼 當G
Android中OkHttp使用(包括上傳與下載)
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
Python中matplotlib庫的基本用法
matplotlib庫是Python優秀的資料視覺化第三方庫。它提供了一整套和matlab相似的命令API,十分適合互動式地進行製圖。而且也可以方便地將它作為繪圖控制元件,嵌入GUI應用程式中。matplotlib.pyplot是繪製各類視覺化圖形的命令子庫。 引入matp
c++中STL中的next_permutation函式基本用法
對於next_permutation函式是針對於排列組合問題的庫函式,它的排序方式是按照字典的方式排列的·: 如以下程式碼對於next_permutation函式的初步解釋: #include<cstdio> #include<cstring> #
Android中RxJava使用1----基本原理
簡單說就是:一個被觀察者,一個(或多個)觀察者,被觀察者給觀察者發訊息。 具體就是: 1)Observable:被觀察者(主題Subject) 2)Observer/Subscriber :觀察者 3)Subscribe:訂閱(就是被觀察者給觀察者發訊息) Ob
Android中RxJava使用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中加入那動畫,記得當時用費了好大的勁...不提了,說多了都是淚... 先了解下,目前可以實現動畫的
Android中ImageSwitcher詳解(注意與圖片瀏覽器的區別)
先看看繼承關係,ImageSwitcher和TextSwitcher的繼承關係是一樣的。兩個重要的父類:ViewSwitcher和ViewAnimator 繼承於ViewSwitcher,說明具備了切換功能 繼承於ViewAnimator,說明具備了動畫功能 Image
android中泛型方法的用法和作用
舉個例子 首先我的activity中 @Route(path = "/datainit/DataInitActivity") class DataInitActivity: BaseActivity(){ override fun onCreate(savedInstan