Activity 调用 DialogFragment:Dialog 并不总是被关闭
Activity calling a DialogFragment: Dialog does not always get dismissed
我有一个 Activity 像这样调用 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
}
}
}
当我调用对话框时,弹出对话框window。然后,当我单击取消(NegativeButton)时,对话框会按预期消失。当我单击删除(PositiveButton)时,对话框再次按预期消失。
但是,成功删除后,当我再次调用对话框时,单击取消不会立即关闭对话框;取而代之的是,对话框再次弹出,仅在第二次单击“删除”后才消失。 FragmentManager 似乎有问题。我在这里错过了什么?
你应该打电话给
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 数据库中的项目会在我的 ValueEventListener
中触发一个 onDataChange
事件,然后调用 updateUI
函数。不幸的是,我将我的 onItemTouchListener
处理 onItemClick
事件(比如我通过 DialogFragment 的 remove() 指令)放在那里,只要我没有更改我的 Firebase 数据库中的任何数据,它就可以正常工作。但是从那里删除一个项目会触发一个循环,导致我的代码出现 "erratic" 行为。解决方案是将对我的 onItemTouchListener
(处理 onItemClicks)的调用从 updateUI 函数移动到代码的 onCreate 部分。呵呵,学到东西了!
我有一个 Activity 像这样调用 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
}
}
}
当我调用对话框时,弹出对话框window。然后,当我单击取消(NegativeButton)时,对话框会按预期消失。当我单击删除(PositiveButton)时,对话框再次按预期消失。
但是,成功删除后,当我再次调用对话框时,单击取消不会立即关闭对话框;取而代之的是,对话框再次弹出,仅在第二次单击“删除”后才消失。 FragmentManager 似乎有问题。我在这里错过了什么?
你应该打电话给
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 数据库中的项目会在我的 ValueEventListener
中触发一个 onDataChange
事件,然后调用 updateUI
函数。不幸的是,我将我的 onItemTouchListener
处理 onItemClick
事件(比如我通过 DialogFragment 的 remove() 指令)放在那里,只要我没有更改我的 Firebase 数据库中的任何数据,它就可以正常工作。但是从那里删除一个项目会触发一个循环,导致我的代码出现 "erratic" 行为。解决方案是将对我的 onItemTouchListener
(处理 onItemClicks)的调用从 updateUI 函数移动到代码的 onCreate 部分。呵呵,学到东西了!