Android - 每种类型的 DialogFragment 显示不超过 1 个
Android - Don't show more than 1 of each type of DialogFragment
我们的应用程序中使用了很多不同类型的 DialogFragment
,因此我创建了一个 BaseFragment
来提取一些通用代码。但是有一个限制:我们不应该在任何给定时间显示超过 1 个相同类型片段的实例(但是,我们 应该 同时显示 FragmentA
和 FragmentB
如果它们同时发生)。
我目前在下面的代码确实实现了这种行为,但我不满意,因为它会在子 类 中产生大量样板。有没有更简洁的方法来完成这个?
基础片段
abstract class BaseFragment : DialogFragment() {
override fun show(manager: FragmentManager, tag: String?) {
if (!isShowing()) {
setShowing(true)
super.show(manager, tag)
}
}
override fun onDismiss(dialog: DialogInterface) {
super.onDismiss(dialog)
setShowing(false)
}
abstract fun isShowing(): Boolean
abstract fun setShowing(isShowing: Boolean)
override fun onCreateDialog(savedInstanceState: Bundle?) {
// ...
}
}
子片段
class ChildFragment : BaseFragment() {
companion object {
private var sIsShowing = false
}
override fun onCreateDialog(savedInstanceState: Bundle?): AlertDialog {
// ...
return super.onCreateDialog(savedInstanceState)
}
// ...
override fun isShowing(): Boolean = sIsShowing
override fun setShowing(isShowing: Boolean) { sIsShowing = isShowing }
}
您可以这样做:
abstract class BaseFragment : DialogFragment() {
override fun show(manager: FragmentManager, tag: String?) {
if (manager.findFragmentByTag(tag) == null) {
super.show(manager, tag)
manager.executePendingTransactions()
}
}
}
请注意在同一对话框 类 之间保持 tag
相同。例如,扩展 BaseFragment
的 Dialog1
的所有实例都应具有相同的 tag
,这与 [= 的另一个子 类 中使用的 tag
不同13=].
我们的应用程序中使用了很多不同类型的 DialogFragment
,因此我创建了一个 BaseFragment
来提取一些通用代码。但是有一个限制:我们不应该在任何给定时间显示超过 1 个相同类型片段的实例(但是,我们 应该 同时显示 FragmentA
和 FragmentB
如果它们同时发生)。
我目前在下面的代码确实实现了这种行为,但我不满意,因为它会在子 类 中产生大量样板。有没有更简洁的方法来完成这个?
基础片段
abstract class BaseFragment : DialogFragment() {
override fun show(manager: FragmentManager, tag: String?) {
if (!isShowing()) {
setShowing(true)
super.show(manager, tag)
}
}
override fun onDismiss(dialog: DialogInterface) {
super.onDismiss(dialog)
setShowing(false)
}
abstract fun isShowing(): Boolean
abstract fun setShowing(isShowing: Boolean)
override fun onCreateDialog(savedInstanceState: Bundle?) {
// ...
}
}
子片段
class ChildFragment : BaseFragment() {
companion object {
private var sIsShowing = false
}
override fun onCreateDialog(savedInstanceState: Bundle?): AlertDialog {
// ...
return super.onCreateDialog(savedInstanceState)
}
// ...
override fun isShowing(): Boolean = sIsShowing
override fun setShowing(isShowing: Boolean) { sIsShowing = isShowing }
}
您可以这样做:
abstract class BaseFragment : DialogFragment() {
override fun show(manager: FragmentManager, tag: String?) {
if (manager.findFragmentByTag(tag) == null) {
super.show(manager, tag)
manager.executePendingTransactions()
}
}
}
请注意在同一对话框 类 之间保持 tag
相同。例如,扩展 BaseFragment
的 Dialog1
的所有实例都应具有相同的 tag
,这与 [= 的另一个子 类 中使用的 tag
不同13=].