DialogFragment
从单词可以看到是Dialog与Fragment组合而成。本质上DialogFragment其实是一个Fragment,内部持有一个Dialog,拥有fragment的生命周期
,DialogFragment有两个比较重要的方法onCreateDialog
和onCreateView
onCreateDialog和onCreateView只需要实现一个就可以了
如果两个都写并且onCreateDialog返回了一个Dialog子类实例对象,则onCreateView返回的视图无效
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 ->
// 响应正面按钮点击事件
}
.setNegativeButton("Cancel") { dialog, which ->
dialog.dismiss()
}
return builder.create() // 返回 AlertDialog
}
}
// 显示 DialogFragment
val dialogFragment = MyAlertDialogFragment()
dialogFragment.show(supportFragmentManager, "myAlertDialog")
1、简单UI:比如如返回一个系统的AlertDialog只需要在onCreateDialog返回一个AlertDialog即可
2、自定义复杂UI,实现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)
// 设置按钮点击事件
binding.button.setOnClickListener {
dismiss() // 关闭对话框
}
}
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 // 设置生命周期所有者
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null // 清理绑定
}
}