Android 调用DialogFragment:Dialog的活动并不总是被取消

Android 调用DialogFragment:Dialog的活动并不总是被取消,android,kotlin,dialogfragment,fragmentmanager,Android,Kotlin,Dialogfragment,Fragmentmanager,我有一个调用DialogFragment的活动,如下所示: private fun showDeleteDetailDialog(itemView: View, categoryId: String, detailId: String) { val dialog = DeleteDetailDialogFragment.newInstance(categoryId, detailId) dialog.show(this@DetailsActivity.fragmentManage

我有一个调用DialogFragment的活动,如下所示:

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
    }
}
}
当我调用对话框时,对话框窗口弹出。然后单击“取消”否定按钮时,对话框将按预期消失。当我单击Delete the PositiveButton时,对话框将消失,再次如预期的那样

但是,成功删除后,当我再次调用对话框时,单击“取消”不会立即取消对话框;相反,对话框会再次弹出,只在第二次单击“删除”后消失。碎片管理器似乎有问题。我错过了什么?

你应该打电话给我

 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
    }

上面的代码没有问题!删除Firebase数据库中的项目触发了my ValueEventListener中的onDataChange事件,该事件随后调用了updateUI函数。不幸的是,我让我的onItemTouchListener通过DialogFragment处理onItemClick事件,比如我的remove指令,只要我不更改Firebase数据库中的任何数据,它就可以正常工作。但是删除其中的一项会触发一个循环,导致我的代码行为不稳定。解决方案是将对处理OnItemClick的onItemTouchListener的调用从updateUI函数移动到代码的onCreate部分。哈,我学到了一些东西

不幸的是,这不起作用,调用dismise或dismissAllowingStateLoss也不起作用。我想指出,从适配器类调用此对话框可以完美地工作@CEOtech4lifeapps请将此添加到您的问题部分。我已尝试使用自定义对话框。结果是一样的。只有当我通过调用deleteDetail访问Firebase数据库时,才会出现这种奇怪的行为。@CEOtech4lifeapps前进!