我正在尝试在rotate上恢复我的ViewPager中的片段以解决一些问题,并编写了一些代码,这些代码在正常使用时可以很好地工作,但当我试图将其作为泛型函数重用时,它不起作用。
无论我试图使用传入的参数在childFragmentManager.fragments.find
中做什么,在尝试执行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操作符可以减少这一点,但我首先试图让它像预期的那样工作……
发布于 2018-06-02 12:46:40
看起来我不需要泛型就能做到这一点。但经过进一步考虑后,在可以使用clazz.newInstance()的地方使用泛型,而不是创建要检查的类,将会更有效,所以如果有方法可以做到这一点,我更喜欢它。
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
}
https://stackoverflow.com/questions/50653445
复制相似问题