【发布时间】:2018-06-02 04:13:50
【问题描述】:
我正在尝试在旋转时恢复 ViewPager 中的片段以解决一些问题,并编写了一些正常使用时可以完美运行的代码,但是当我尝试使其成为通用函数以重用它时,它不起作用。
无论我尝试使用传入的参数在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 操作符来减少这种情况,但我试图首先让它按预期工作......
【问题讨论】:
-
我认为您不应该调用片段。那不是受限制的 API 吗?
-
您的 is-check 错误。你是在问这个类是否是一个类
,而不是一个东西。考虑改用内联具体化函数,然后您甚至不需要传递类引用。 -
你建议的工作,但我仍然必须通过类引用才能在其他地方实例化它?如果你为它写一个答案,我可以标记它。 inline fun
FragmentManager.findOrCreateFragment(clazz: Class ): T? { return this.fragments.find { 它是 T } 作为 T? ?: clazz.newInstance() } -
API 也不受限制,只是我调用子片段管理器。我需要相同的片段来重新附加我的演示者,否则它是空的。
-
也刚刚意识到我不需要返回 T?可以返回T