DialogFragment
從單詞可以看到是Dialog與Fragment組合而成捷凄。本質(zhì)上DialogFragment其實(shí)是一個(gè)Fragment籍铁,內(nèi)部持有一個(gè)Dialog,擁有fragment的生命周期
趣苏,DialogFragment有兩個(gè)比較重要的方法onCreateDialog
和onCreateView
onCreateDialog和onCreateView只需要實(shí)現(xiàn)一個(gè)就可以了
如果兩個(gè)都寫(xiě)并且onCreateDialog返回了一個(gè)Dialog子類實(shí)例對(duì)象扰楼,則onCreateView返回的視圖無(wú)效
class MyAlertDialogFragment : DialogFragment() {
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val builder = AlertDialog.Builder(requireActivity())
.setTitle("Alert Dialog Title")
.setMessage("This is an example of an AlertDialog.")
.setPositiveButton("OK") { dialog, which ->
// 響應(yīng)正面按鈕點(diǎn)擊事件
}
.setNegativeButton("Cancel") { dialog, which ->
dialog.dismiss()
}
return builder.create() // 返回 AlertDialog
}
}
// 顯示 DialogFragment
val dialogFragment = MyAlertDialogFragment()
dialogFragment.show(supportFragmentManager, "myAlertDialog")
1、簡(jiǎn)單UI:比如如返回一個(gè)系統(tǒng)的AlertDialog只需要在onCreateDialog返回一個(gè)AlertDialog即可
2划鸽、自定義復(fù)雜UI输莺,實(shí)現(xiàn)onCreateView返回自定義視圖
加載自定義視圖的方式
1、使用普通
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.my_dialog,container,false)
}
2裸诽、使用View Binding
class MyDialogFragment : DialogFragment() {
private var _binding: DialogFragmentLayoutBinding? = null
private val binding get() = _binding!!
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = DialogFragmentLayoutBinding.inflate(inflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
// 設(shè)置按鈕點(diǎn)擊事件
binding.button.setOnClickListener {
dismiss() // 關(guān)閉對(duì)話框
}
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null // 清理綁定
}
}
3嫂用、使用Data Binding
class MyDialogFragment : DialogFragment() {
private var _binding: DialogFragmentLayoutBinding? = null
private val binding get() = _binding!!
private lateinit var viewModel: MyViewModel
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = DataBindingUtil.inflate(inflater, R.layout.dialog_fragment_layout, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewModel = ViewModelProvider(this).get(MyViewModel::class.java)
binding.viewModel = viewModel // 綁定 ViewModel
binding.lifecycleOwner = viewLifecycleOwner // 設(shè)置生命周期所有者
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null // 清理綁定
}
}