使用 DialogFragment 顯示對話框
DialogFragment
是一個特殊的片段子類,專為創(chuàng)建和托管 Dialog而設計浪南。嚴格來說笼才,您不需要在片段中托管對話框,但這樣做可以 FragmentManager
管理對話框的狀態(tài)并在發(fā)生配置更改時自動恢復對話框络凿。
創(chuàng)建一個 DialogFragment
要創(chuàng)建DialogFragment
患整,首先創(chuàng)建一個擴展 DialogFragment
和覆蓋 的類,onCreateDialog()
如下例所示喷众。
class PurchaseConfirmationDialogFragment : DialogFragment() {
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog =
AlertDialog.Builder(requireContext())
.setMessage(getString(R.string.order_confirmation))
.setPositiveButton(getString(R.string.ok)) { _,_ -> }
.create()
companion object {
const val TAG = "PurchaseConfirmationDialog"
}
}
類似于應該如何 在普通片段中onCreateView()
創(chuàng)建根各谚, 應該創(chuàng)建一個以顯示為. 顯示片段生命周期中適當狀態(tài)的句柄。View
onCreateDialog()
Dialog
DialogFragment
DialogFragment
Dialog
就像 with 一樣到千,您可以返回 from的onCreateView()
任何子類昌渤,并且不僅限于使用 。Dialog``onCreateDialog()
AlertDialog
顯示DialogFragment
無需手動創(chuàng)建一個FragmentTransaction來顯示您的DialogFragment. 相反憔四,使用該show()方法來顯示您的對話框膀息。您可以傳遞對 FragmentManager 和 引用以String用作FragmentTransaction標記般眉。DialogFragment從中創(chuàng)建時Fragment,您必須使用Fragment's childFragmentManager以確保在配置更改后正確恢復狀態(tài)潜支。非空標簽允許您在以后使用它 findFragmentByTag()來檢索DialogFragment甸赃。
DialogFragment生命周期
DialogFragment
遵循標準的片段生命周期。此外 DialogFragment
還有一些額外的生命周期回調(diào)冗酿。最常見的如下:
-
onCreateDialog()
- 覆蓋此回調(diào)以提供Dialog
片段以管理和顯示埠对。 -
onDismiss()
- 如果您需要在您Dialog
被解雇時執(zhí)行任何自定義邏輯,例如釋放資源裁替、取消訂閱可觀察資源等项玛,請覆蓋此回調(diào)。 -
onCancel()
- 如果您在Dialog
取消時需要執(zhí)行任何自定義邏輯弱判,請覆蓋此回調(diào)襟沮。
DialogFragment
還包含關閉或設置您的可取消性的方法DialogFragment
:
-
dismiss()
- 關閉片段及其對話框。如果片段被添加到后退堆棧昌腰,則彈出所有后退堆棧狀態(tài)直到并包括此條目开伏。否則,將提交一個新事務以刪除該片段遭商。 -
setCancellable()
- 控制顯示Dialog
是否可取消固灵。應該使用此方法而不是直接調(diào)用Dialog.setCancelable(boolean)
.
請注意,您不會覆蓋 onCreateView()
或 onViewCreated()
在使用 a 時使用DialogFragment
a Dialog
株婴。對話框不僅僅是視圖——它們有自己的窗口怎虫。因此暑认,覆蓋是不夠的 onCreateView()
困介。此外,除非您已覆蓋并提供非空視圖蘸际,否則onViewCreated()
永遠不會調(diào)用自定義座哩。DialogFragment``onCreateView()
使用自定義視圖
您可以通過覆蓋來創(chuàng)建DialogFragment
和顯示對話框 ,或者像使用典型片段一樣 onCreateView()
給它 a 粮彤,或者使用Fragment 1.3.0-alpha02 中引入的構造函數(shù)根穷。layoutId
DialogFragment
onCreateView()View
返回的值 會自動添加到對話框中。在大多數(shù)情況下导坟,這意味著您不需要覆蓋 屿良,因為默認的空對話框會填充您的視圖。onCreateDialog()
的某些子類DialogFragment
惫周,例如 BottomSheetDialogFragment
尘惧,將您的視圖嵌入到樣式為底部工作表的對話框中。