作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试在我的 ViewPager 中恢复一个 fragment 以解决一些问题,并编写了一些在正常使用时可以完美运行的代码,但是当我尝试使其成为一个通用函数以重用它时,它不起作用。
无论我尝试在 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 运算符来减少,但我试图首先让它按预期工作......
最佳答案
你要找的是这样的:
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,但你是对的,它似乎不再如此。
关于android - 使用泛型在 childFragmentManager 中使用 "is"查找 fragment 不可用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50653445/
我是一名优秀的程序员,十分优秀!