我尝试在我的ViewPager中恢复一个片段以解决一些问题,并编写了一些在正常使用时完美运行的代码,但是当我尝试将其作为一个通用函数来重用它时,它&# 39;不工作。
无论我在childFragmentManager.fragments.find
lambda中尝试做什么,使用我的传入参数仍然是红色的,并且在尝试进行IS检查时不可用。
工作代码
val studySurveyFragment = if (restoring) {
val fragment = childFragmentManager.fragments.find { it is StudySurveyFragment }
if (fragment == null) {
StudySurveyFragment()
} else {
fragment as StudySurveyFragment
}
} else {
StudySurveyFragment()
}
我尝试使用通用版
create(StudySurveyFragment(), StudySurveyFragment::class.java)
fun <T> create(fragment: Fragment, fragmentClass: Class<T>): Fragment {
return if (restoring) {
val findFragment = childFragmentManager.fragments.find { it is fragmentClass }
if (findFragment == null) {
fragment
} else {
findFragment
}
} else {
fragment
}
}
更新:我也试过这样做,这会编译,但检查实际上没有工作
childFragmentManager.fragments.find {it.javaClass.isInstance(fragmentClass)}
注意:我知道这可以通过一些elvis操作员来减少,但我试图让它按预期工作......
答案 0 :(得分:2)
您正在寻找的是这样的:
inline fun <reified T : Fragment> FragmentManager.findOrCreateFragment(): T {
return fragments.find { it is T } as T? ?: T::class.java.newInstance()
}
无需传递类引用。
PS:我很确定fragmentManager.getFragments()
(或者,在Kotlin,fragmentManager.fragments
)以前是受限制的API,但你是对的,它没有似乎已经不复存在了。
答案 1 :(得分:0)
看起来我可以在没有泛型的情况下做到这一点......但是在进一步考虑之后,使用泛型我可以去clazz.newInstance()而不是必须创建要检查的类会更有效,所以如果有&#39;这样做的方式我更喜欢它。
fun create(fragment: Fragment): Fragment {
return if (restoring) {
val findFragment =
childFragmentManager.fragments.find { it.javaClass.isInstance(fragment) }
if (findFragment == null) {
fragment
} else {
findFragment
}
} else {
fragment
}
}
可以缩短到这一点,也意识到如果它没有恢复,它们无论如何都会为空......
fun findOrCreate(fragment: Fragment): Fragment {
return childFragmentManager.fragments.find { it.javaClass.isInstance(fragment) } ?: fragment
}