【问题标题】:how to close dialog fragment properly如何正确关闭对话框片段
【发布时间】:2022-01-09 15:40:28
【问题描述】:

我尝试了两种解决方案来关闭片段,但这些都不适合我。 第一个解决方案:-

binding.closeBtn.setOnClickListener {
            dismiss()
        }

当我关闭此解决方案时,我的对话框背面完全空白。

第二种解决方案:-

close_btn.setOnClickListener {
            requireActivity().onBackPressed()
        }

当我关闭对话框时,我的整个应用程序都会关闭。

你能帮我解决我的问题吗

 class CongratulationsDialog : DialogFragment() {
    lateinit var bid :String
    lateinit var sharedPreference: SharedPreference
    var mLogoProgressDialog: ProgressDialog? = null
    var text : String = ""
    var uid :String = ""
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?): View? {
        val binding = DataBindingUtil.inflate<CongratulationsDialogBinding>(
            inflater,
            R.layout.congratulations_dialog,
            container,
            false)
        dialog?.requestWindowFeature(Window.FEATURE_NO_TITLE)
        dialog?.setContentView(R.layout.congratulations_dialog)
        dialog?.window?.setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT)

        sharedPreference = activity?.let { SharedPreference(it) }!!
        bid = sharedPreference.getValueString("sendBid").toString()
        text = sharedPreference.getValueString("token").toString()
        uid = sharedPreference.getValueString("login_uid").toString()
        Log.d("checkLoginId",""+uid+"Bid"+bid)
        initializeLogoProgressDialog()
        loadBettingStatus(bid,text,binding)

        binding.closeBtn.setOnClickListener {
            dismiss()
        }
        binding.createNewBoastButton.setOnClickListener {
            view?.let { it1 ->
                Navigation.findNavController(it1)
                    .navigate(R.id.action_congratulationsDialog_to_newBoastFragment)
            }
        }
        return binding.root
    }

    private fun initializeLogoProgressDialog() {
        if (mLogoProgressDialog == null) {
            Log.w("PBFX", "initializeLogoProgressDialog called - mLogoProgressDialog = NULL")
        } else {
            Log.w("PBFX", "initializeLogoProgressDialog called - mLogoProgressDialog NOT NULL")
        }
        if (mLogoProgressDialog == null) {
            dismissLogoProgressDialog()
            mLogoProgressDialog = ProgressDialog(requireContext())
            mLogoProgressDialog!!.show()
            mLogoProgressDialog!!.setCancelable(false)
            mLogoProgressDialog!!.getWindow()!!
                .setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
            mLogoProgressDialog!!.setContentView(R.layout.progress_bar)
        }
    }

    private fun loadBettingStatus(bid: String, text: String, binding: CongratulationsDialogBinding) {
        val apiInterface = RetrofitService.api.getInviteesDetails(bid,"Bearer "+text)

        apiInterface.enqueue( object : Callback<Invitees> {
            override fun onResponse(call: Call<Invitees>?, response: Response<Invitees>) {
                if (response.isSuccessful) {
                    dismissLogoProgressDialog()
                    if (response?.body() != null) {
                        if(response.body()!!.data.status.equals("completed")) {
                            binding.textView7.text =response.body()!!.data.name
                            if (uid.equals(response.body()!!.data.betWinner.uid)) {
                                binding.youTxt.setText("You")
                                if(response.body()!!.data.mode.equals("task")){
                                    binding.textView10.setText(response.body()!!.data.taskTitle)
                                }else{
                                    binding.textView10.setText("$"+response.body()!!.data.value)
                                }
                            } else {
                                dismissLogoProgressDialog()
                                binding.youTxt.setText(response.body()!!.data.betWinner.name)
                                if(response.body()!!.data.mode.equals("task")){
                                    binding.textView10.setText(response.body()!!.data.taskTitle)
                                }else{
                                    binding.textView10.setText("$"+response.body()!!.data.value)
                                }
                            }
                        }
                    }
                }else{
                    dismissLogoProgressDialog()
                }
            }
            override fun onFailure(call: Call<Invitees>?, t: Throwable?) {
                if (t != null) {
                    dismissLogoProgressDialog()
                    Log.d("gettingFailure",""+t.message)
                }
            }
        })
    }

    private fun dismissLogoProgressDialog() {
        if (mLogoProgressDialog != null) {
            mLogoProgressDialog!!.dismiss()
        }
        mLogoProgressDialog = null
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
       // close_btn.setOnClickListener {
       //     requireActivity().onBackPressed()
       // }
    }
    override fun getTheme() = R.style.RoundedCornersDialog
}

【问题讨论】:

  • dismiss() 是正确的方法。 “此解决方案的背面完全空白”这是什么意思?
  • 关闭祝贺对话框后,它转到我的主页片段,该页面完全为空,我无法看到该页面中的任何数据
  • dismiss() 就足够了。对于丢失的数据,您需要在 Home 片段上调试生命周期的东西。请添加代码,询问您打开 DialogFragment 的方式和位置。

标签: android kotlin android-dialogfragment dismiss


【解决方案1】:

我认为这是关闭对话框的更好方法。

Fragment frag = getSupportFragmentManager().findFragmentByTag("fragment_dialog");
if (frag != null) {
    DialogFragment df = (DialogFragment) frag;
    df.dismiss();
}

【讨论】:

  • 什么是prev
  • 嘿抱歉刚才我编辑了内容请现在检查一下
  • 如果你想从另一个片段中关闭这个对话框片段,你可以使用 typealias。 (仅限 Kotlin)
  • 我认为这并不能解决 OP 问题,因为这与在对话框实例中执行 dismiss() 相同。
  • “你可以使用 typealias”是什么意思?
猜你喜欢
  • 2018-03-04
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 2014-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多