[英]Get context and activity (no null) on Fragment inside a setOnCLickListener
我正在嘗試使用通用對話框構建器在片段中構建一個對話框,該構建器已經是我正在處理的項目的一部分。 我需要將上下文(不可為空)和活動(也不可為空)傳遞給對話框。 為此,我使用了 requireContext() 和 requireActivity(),但我的同事告訴我在這里使用 require 方法很危險,因為它可能導致生產崩潰。 我怎么能避免呢?
請參閱 MyFragment 中的 setup()
GenericDialog.build( context = requireContext() , title = string(R.string.my_string_title), content = string(R.string.my_string_msg)).safeShow( requireActivity() )
class MyFragment : BaseFragment(R.layout.fragment_my_fr) {
...
override fun onViewCreated(view: View, savedInstanceState: Bundle?) = super.onViewCreated(view, savedInstanceState).also {
setup()
}
private fun setup() {
binding.myButton.setOnClickListener {
GenericDialog.build(context = requireContext(), title = string(R.string.my_string_title), content = string(R.string.my_string_msg)).safeShow(requireActivity())
}
}
}
safeShow 擴展 function
fun Dialog.safeShow(activity: Activity) = activity.runOnUiThread {
if (!activity.isFinishing and !this.isShowing and !activity.isDestroyed) {
show()
}
}
通用對話框
object GenericDialog {
fun build(
context: Context,
title: String = "",
content: String = "",
acceptButtonTextResId: Int = R.string.general_understood,
onAccept: () -> Unit = {}
): AlertDialog = AlertDialog.Builder(context, R.style.Dialog)
.setTitle(title)
.setMessage(content)
.setCancelable(false)
.setPositiveButton(acceptButtonTextResId) { dialog, _ ->
onAccept()
dialog.dismiss()
}
.create()
}
我最后所做的是將 Dialog 代碼包裝在一個 let safe 調用中,所以如果活動是 null,我什至不顯示 Dialog。
activity?.let { safeActivity ->
GenericDialog.build(context = safeActivity, title = string(R.string.my_string_title), content = string(R.string.my_string_msg)).safeShow(safeActivity)
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.