英文:
How to prevent showing multiple DialogFragments in Android?
问题
我在我的Android应用程序中有一些自定义的DialogFragments。我想要防止用户打开多个对话框,同时避免禁用显示对话框的按钮一次按下后或使用变量。
所以我尝试为片段制作一个扩展,通过它们的标签来检查显示的片段,就像这样:
fun Fragment.isFragmentVisible(tag: String): Boolean {
val fragment = childFragmentManager.findFragmentByTag(tag)
if (fragment != null && fragment.isVisible) {
return true
}
return false
}
在显示对话框之前进行检查,就像这样:
binding.destination.editText?.setOnClickListener {
if (!isFragmentVisible(ShopsDialog.TAG)) {
ShopsDialog.newInstance(this, "Destinazione") { bundle ->
val shopId = bundle.getString("shopId")
viewModel.setDestination(shopId)
}
}
}
而newInstance
函数如下:
fun newInstance(fragment: Fragment, title: String, bundle: (Bundle) -> Unit) = ShopsDialog().apply {
arguments = Bundle().apply {
putString(ARG_TITLE, title)
}
fragment.setFragmentResultListener(KEY_CALLBACK_BUNDLE) { requestKey: String, bundle: Bundle ->
if (requestKey == KEY_CALLBACK_BUNDLE) {
bundle(bundle)
}
}
show(fragment.childFragmentManager, TAG)
}
但是这似乎不起作用,我甚至尝试使用requireActivity().supportFragmentManager
而不是childFragmentManager
,但仍然没有效果...
英文:
I have some custom DialogFragments in my Android application. I would prevent the user from opening multiple dialogs, and I would also avoid disabling the button which shows the dialog once it's pressed or using a variable or it.
So I was trying to make an extension for the fragment which checks for shown fragments via their tags like this:
fun Fragment.isFragmentVisible(tag: String): Boolean {
val fragment = childFragmentManager.findFragmentByTag(tag)
if (fragment != null && fragment.isVisible) {
return true
}
return false
}
And before showing the dialog to check it like this:
binding.destination.editText?.setOnClickListener {
if (!isFragmentVisible(ShopsDialog.TAG)) {
ShopsDialog.newInstance(this, "Destinazione") { bundle ->
val shopId = bundle.getString("shopId")
viewModel.setDestination(shopId)
}
}
}
While the newInstance is:
fun newInstance(fragment: Fragment, title: String, bundle: (Bundle) -> Unit) = ShopsDialog().apply {
arguments = Bundle().apply {
putString(ARG_TITLE, title)
}
fragment.setFragmentResultListener(KEY_CALLBACK_BUNDLE) { requestKey: String, bundle: Bundle ->
if (requestKey == KEY_CALLBACK_BUNDLE) {
bundle(bundle)
}
}
show(fragment.childFragmentManager, TAG)
}
But this seems not to work, I've tried even to use requireActivity().supportFragmentManager
instead childFragmentManager
but still nothing...
答案1
得分: 1
在显示底部对话框片段之前,我认为你可以像这样检查它
if (childFragmentManager.findFragmentByTag(ShopsDialog::class.java.simpleName) == null) {
// 显示你的底部对话框片段
}
如果你要在 Fragment 中显示 BottomSheetDialogFragment,那么请使用 childFragmentManager
,如果在 Activity 中显示,则使用 supportFragmentManager
。
英文:
Before showing bottomsheetdialogfragment , i think you can check it like this
if(childFragmentManager.findFragmentByTag(ShopsDialog::class.java.simpleName) == null){
// show your bottom sheet dialog fragment
}
If you are going to show bottomSheetDialogFragment in Fragment then use childFragmentManager
and if it is activity then use supportFragmentManager
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论