除了前一篇可以回答是或否的 alert dialog 以外,還有其他的 dialog 的表示方式
首先是單選,畫面會以列表的方式顯示內容。
AlertDialog.Builder(this)
.setTitle("Items")
.setItems(list) { _, position ->
Snackbar.make(layout, "$position", Snackbar.LENGTH_SHORT).show()
}.show()
lambda 中的 position 代表選取哪一個,position 從 0 開始。所以如果我點選 C 選項的話,snack bar 會顯示 2。
點下其中一個選項以後,就會自己關閉
這個也是單選,有點像是 checkbox,但是是再按下按鈕才可以退出。
AlertDialog.Builder(this)
.setTitle("SingleChoiceItems")
.setSingleChoiceItems(list, 0){ _, position ->
Snackbar.make(layout, "$position", Snackbar.LENGTH_SHORT).show()
}.setPositiveButton("Ok"){ _, position ->
Snackbar.make(layout, "$position is selected", Snackbar.LENGTH_SHORT).show()
}
.show()
除了設定 positive button,還可以監聽點選時的選項,得知使用者點下了哪一個選項。
相對於上面的單選,這個就是複選了,看起來像是 radio button。
不同的是,它會可以加一個 array 放每個選項的狀態
val isCheckedList= booleanArrayOf(true, true, false, false, false)
這樣剛出現 dialog 時,就會像上面的一樣,A 跟 B 都先選取起來了
AlertDialog.Builder(this)
.setTitle("MultiChoiceItems")
.setMultiChoiceItems(list, isCheckedList) { _, position, isChecked ->
Snackbar.make(layout, "$position: $isChecked", Snackbar.LENGTH_SHORT).show()
isCheckedList[position]= isChecked
}.setPositiveButton("Ok"){ _, _ ->
Snackbar.make(layout, "isChecked: ${isCheckedList.filter { true }}", Snackbar.LENGTH_SHORT).show()
}
position 跟 isChecked 代表使用者點下的那個選項位置跟狀態。
往後要知道哪一個選項有被選取,就可以從原本的 array 得知。
這是一個可以選擇日期的 dialog。
val now= LocalDate.now()
呼叫 LocalDate 的 now 方法,得知現在的日期。
但要使用此方法,要 API level 26 以上,更改一下 build.gradle 的 minSdkVersion 或是改用其他方法取得。
DatePickerDialog(this, { _, year, month, day ->
Snackbar.make(layout, "Selected Date: $year/$month/$day", Snackbar.LENGTH_SHORT).show()
}, now.year, now.monthValue, now.dayOfMonth).show()
裡面的 year, month, day 即為選取的日期。
最後面的三個參數,是開啟 dialog 的預設選擇日期,所以前面才需要今天的日期。
val now= LocalTime.now()
跟日期一樣 LocalDate 的 now 方法,取得現在的時間。一樣需要 API level 26 或以上
TimePickerDialog(this, { _, hour, minute ->
Snackbar.make(layout, "Selected Time: $hour:$minute", Snackbar.LENGTH_SHORT).show()
}, now.hour, now.minute, true).show()
一樣的,裡面的 hour, minute 即為選取的時間;後面的兩個參數是預設選取時間。
而最後的 true 是代表是否要以 24 小時制呈現。
如果上述的 dialog 類型都不滿意的話,可以自己做一個 view,再用 setView 帶入。