使用Generics在childFragmentManager中使用"查找片段是"不可用?

时间:2018-06-02 04:13:51

标签: android generics kotlin

我尝试在我的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操作员来减少,但我试图让它按预期工作......

2 个答案:

答案 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
}