簡體   English   中英

在 setOnCLickListener 內的 Fragment 上獲取上下文和活動(不為空)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM