
介紹AlertDialog對話框從簡到繁的多種設計方案,從新角度理解UI交互設計。
AlertDialog對話框允許自定義彈出對話框的內容,實現比之前講解的幾種對話框更豐富的功能。
01
帶默認按鈕的AlertDialog

程序單擊按鈕後執行第17行代碼,調用自定義方法showAlertDialog()。
第22~62行是自定義showAlertDialog()方法。調用AlertDialog()的順序是先定義Builder;對Builder調用相關方法設定屬性;定義默認按鈕及單擊監聽器;調用Builder的create()方法生成AlertDialog;最後調用AlertDialog的show()方法顯示對話框。
第24行初始化builder,此時builder擁有AlertDialog對話框的默認主題。
第25行調用setTitle()方法設置對話框的標題。
第26行調用setMessage()方法設置對話框的提示信息。
第27行調用setIcon()方法設置對話框圖標。
第30~37行添加PositiveButton按鈕,其中setPositiveButton()方法的第一個參數是按鈕的顯示文本。為了便於閱讀代碼,此按鈕文本儘量採用確定語氣的文字,如「是」「確定」等。第二個參數是按鈕的單擊監聽器。單擊此按鈕將自動關閉對話框,同時執行第35行代碼,在文本輸入框editText1中顯示信息。變量which是PositiveButton按鈕的int型返回值。
第40~57行以同樣的方式設置「取消」和「中間」按鈕。不同的Android版本3個按鈕的外觀和位置會有差異。每個對話框可以設置1~3個對話框默認按鈕,也可以不設置按鈕。
第58行的作用是單擊對話框以外的區域,對話框仍然顯示在最上層。默認值為true,單擊對話框以外的區域,對話框將被遮擋。
第59行調用builder的create()方法生成alertDialog1對話框。
第60行調用alertDialog1的show()方法顯示對話框。
帶默認按鈕的AlertDialog運行結果如圖4-84和圖4-85所示。
■圖4-84彈出帶默認按鈕的AlertDialog
■圖4-85返回對話框按鈕信息
02
列表的AlertDialog
AlertDialog除了默認主題的對話框形式外,還支持多種類型的對話框。本案例講解列表風格的AlertDialog。


本案例的大多數代碼與4.24.1節案例的代碼類似,不同點在第29行,setItems()方法將對話框設置為選項列表風格。第一個參數是用於填充下拉選項列表的字符串數組str,str數組在第4行定義。第二個參數為單擊監聽器,處理單擊選項後的觸發事件。
第34行的OnClick()方法以變量which(單擊選項列表返回的選中項索引值)為字符串數組str的索引,獲取對應選中列表中的文本,並將其傳遞給editText1。
列表風格的AlertDialog運行結果如圖4-86和圖4-87所示。
■圖4-86彈出列表風格的AlertDialog
■圖4-87返回列表風格的AlertDialog的選擇信息
03
單選的AlertDialog
單選的AlertDialog是指彈出的對話框顯示單選按鈕風格的AlertDialog。


第4行定義用於單選列表的字符串數組str。
第5行的變量num用於記錄單選風格對話框中選中項的索引值。
關鍵代碼在第31行,setSingleChoiceItems()方法將對話框設置為單選按鈕風格。其中第二個參數checkedItem是設置單選按鈕列表選中項的索引值,如果是-1則所有單選按鈕都設置為未選。
第34行的變量which是單選按鈕列表的索引值,也是選中項對應字符串數組str的索引值。
第45行的變量which是AlertDialog對話框中按鈕被單擊時返回按鈕所對應的int型數值,與第34行的which含義是不同的。
如果去掉第38行的注釋,在彈出的對話框中選中單選項後,cancel()方法將關閉對話框而無須再單擊「確定」按鈕,也就不會執行第42~50行的代碼。
單選的AlertDialog運行結果如圖4-88所示。
■圖4-88單選的AlertDialog運行結果
04
複選的AlertDialog
複選的AlertDialog是指彈出的對話框顯示複選框風格的AlertDialog。

第4行定義用於複選框列表的字符串數組str。
第5行的布爾型數組flags定義了str數組在複選框列表中的選中狀態,true為選中。flags數組的長度應與str數組長度相同。如果flags數組長度小於str數組長度,程序運行到第30行綁定兩個數組到builder時會出錯。如果flags數組長度大於str數組長度,程序運行到第45行取flags數組的長度,執行到第48行可能會因數組索引超出str數組範圍而出錯,只要將第45行的flags.length改成str.length程序就能正常運行。
第30行的setMultiChoiceItems()方法將AlertDialog設置為複選框列表。
第35行將複選項的變動值(true或false)同步到flags數組的對應項。
第45行使用for循環遍歷數組flags,狀態為true的索引項返回str數組的對應值。
第50行將對話框的返回結果傳遞給editText1。
第53~54行調用builder的create方法生成alertDialog1,再調用show方法顯示對話框。
05
自定義控件
目前為止已經介紹了多種對話框,這些對話框的內置控件都是定製好的。本案例講解自定義對話框中的控件。為便於講解,對話框中的控件只加入EditText和Button,讀者理解設計方式後可自行添加所需控件。

第17~19行通過自定義showAlertDialog()方法的不同參數調用不同形式的自定義對話框。
當參數為10時執行第29行開始的代碼,實現動態添加控件,常用於對布局要求不高的場景。第30行使用EditText的構造方法生成一個文本輸入框editTextName。第31行將生成的editTextName文本輸入框添加到builder中。第32行添加對話框的標題。第33行添加「確定」按鈕,按鈕的單擊監聽器將對話框中的editTextName內容傳回main.xml布局文件中的editText1中。
當參數為20時執行第42行開始的代碼。此時調用已經設計好的布局文件login.xml。第43行聲明LayoutInflater類型的變量inflater20。第44行使用inflate()方法將login.xml中名為linearLayoutLogin的線性布局作為View填充到viewLogin20。第45行是將builder的一系列方法放在一行中連續調用。相關按鈕的監聽器都設置為null,單擊這些按鈕就只能執行默認的關閉對話框操作。
當參數為30時執行第47行開始的代碼,是對方法一的完善,可以返回文本輸入框中的文字內容。實現的方式是重寫按鈕單擊監聽器代碼。在第57行的findViewById()方法前加了viewLogin30限定。第49行viewLogin30對應的是login.xml布局文件的linearLayoutLogin。如果沒有viewLogin30前綴,查找R.id.editTextName從main.xml中查詢,找不到程序就會出錯退出。如果兩個文件中控件重名,沒有viewLogin30前綴的findViewById()方法取回的就是main.xml布局文件中的控件。
帶自定義控件AlertDialog運行結果如圖4-89和圖4-90所示。
■圖4-89彈出帶自定義控件AlertDialog
■圖4-90返回帶自定義控件AlertDialog信息
【注】
Spinner、AutoCompleteTextView和AlertDialog都支持類似的彈出框功能,使用時注意各自的優缺點和使用場景。
實例講解
Android項目開發基礎與實戰

精彩回顧
教學輔助系統使用
Android項目開發相關Java基本概念
約束布局
TextView控件
Button控件
RadioButton控件
精彩預告
Activity
Broadcast
數據庫調試
✦
06
視頻講解
掃碼即可觀看視頻,限時免費3天
07
參考書籍
《Android項目開發基礎與實戰(微課視頻版)》
ISBN:9787302591825
作者:夏江
定價:59.9元

內容簡介
本書結合作者多年講授「Android應用軟件開發」課程的教學經驗,融入Android開發領域新技術,較為全面地介紹了Android應用軟件開發的相關知識點和開發技巧。全書共分5章,分別介紹了Android開發環境、Android項目及Java基本概念、Android常用布局、Android常用控件和其他常用編程技術。本書相關案例以Android Studio為開發環境,儘可能使用最新版本SDK命令替代棄用命令,並對控件的版本變化做大致的介紹。本書全面考慮了本科教學的特點,結合作者開發的案例庫教學輔助系統,通過精心設計的案例和詳盡的講解、演示,讓讀者感受體驗式教學的魅力。本書適合Android Studio開發人員、Android的入門讀者、高等學校學生使用,還可以作為高等院校、相關培訓機構的教學用書。
08
精彩推薦