【问题标题】:Activity calling a DialogFragment: Dialog does not always get dismissed调用 DialogFragment 的活动:对话框并不总是被关闭
【发布时间】:2018-04-30 09:01:14
【问题描述】:

我有一个像这样调用 DialogFragment 的 Activity:

private fun showDeleteDetailDialog(itemView: View, categoryId: String, detailId: String) {
    val dialog = DeleteDetailDialogFragment.newInstance(categoryId, detailId)
    dialog.show(this@DetailsActivity.fragmentManager, "DeleteDetailDialog")
}

这是我的 DialogFragment 的代码(单击 PositiveButton 会删除 Firebase 数据库中的一个项目):

class DeleteDetailDialogFragment : DialogFragment() {

override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
    // Use the Builder class for convenient dialog construction
    val categoryId = arguments.getString(ARG_CATEGORY_ID)
    val detailId = arguments.getString(ARG_DETAIL_ID)
    val builder = AlertDialog.Builder(activity)
    builder.setMessage(R.string.delete_detail)
            .setPositiveButton(R.string.delete, { dialog, id ->
                deleteDetail(categoryId, detailId)
            })
            .setNegativeButton(R.string.cancel, { dialog, id ->
                // User cancelled the dialog
            })
    // Create the AlertDialog object and return it
    return builder.create()
}

private fun deleteDetail(categoryId: String, detailId: String) {
    // get the detail reference for the specified category
    val deleteRef = FirebaseDatabase.getInstance().getReference("details").child(categoryId).child(detailId)
    // remove detail
    deleteRef.removeValue()

    // get the reference for the specified favorite, identified by detailId
    val deleteFaveRef = FirebaseDatabase.getInstance().getReference("favorites").child(detailId)
    // remove favorite
    deleteFaveRef.removeValue()
}

companion object {
    private val ARG_CATEGORY_ID = "category_id"
    private val ARG_DETAIL_ID = "detail_id"

    fun newInstance(categoryId: String, detailId: String): DeleteDetailDialogFragment {
        val fragment = DeleteDetailDialogFragment()
        val args = Bundle()
        args.putString(ARG_CATEGORY_ID, categoryId)
        args.putString(ARG_DETAIL_ID, detailId)
        fragment.arguments = args
        return fragment
    }
}
}

当我调用 Dialog 时,会弹出 Dialog 窗口。然后当我单击取消(NegativeButton)时,对话框按预期消失。当我单击删除(PositiveButton)时,对话框再次按预期消失。

但是,在成功删除后,当我再次调用对话框时,单击取消不会立即关闭对话框;相反,对话框再次弹出,仅在第二次单击删除后消失。 FragmentManager 似乎存在问题。我在这里错过了什么?

【问题讨论】:

    标签: android kotlin dialogfragment fragmentmanager


    【解决方案1】:

    你应该打电话

     getDialog().dismiss()
    

    注意

    您应该在 DeleteDetailDialogFragment 中创建一个自定义对话框。

    class DeleteDetailDialogFragment : DialogFragment() {
    
         override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,savedInstanceState: Bundle?): View?
        {
             val rootView = inflater.inflate(R.layout.your_layout, container,false)
             return rootView
        }
    
        override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
            val dialog = super.onCreateDialog(savedInstanceState)
            dialog.requestWindowFeature(Window.FEATURE_NO_TITLE)
            return dialog
        }
    

    【讨论】:

    • 很遗憾,这不起作用,调用dismiss()dismissAllowingStateLoss() 也不起作用。
    • 我想指出,从适配器类调用此对话框完美无缺!
    • @CEOtech4lifeapps 请将此添加到您的问题部分。
    • 我已尝试使用自定义对话框。结果是一样的。只有当我通过调用 deleteDetail 访问我的 Firebase 数据库时才会发生这种奇怪的行为。
    • @CEOtech4lifeapps 继续前进!
    【解决方案2】:

    上面的代码没有错!删除 Firebase 数据库中的项目会在我的 ValueEventListener 中触发 onDataChange 事件,然后调用 updateUI 函数。不幸的是,我将onItemTouchListener 处理onItemClick 事件(例如通过DialogFragment 的remove() 指令)放置在那里,只要我没有更改Firebase 数据库中的任何数据,它就可以正常工作。但是在那里删除一个项目会触发一个循环,导致我的代码出现“不稳定”行为。解决方案是将对我的onItemTouchListener(处理onItemClicks)的调用从updateUI 函数移动到我的代码的onCreate 部分。呵呵,学到东西了!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-11
      • 2022-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多