Использование Generics для поиска фрагмента в childFragmentManager с использованием «is» не применимо? - PullRequest
0 голосов
/ 02 июня 2018

Я пытаюсь восстановить фрагмент в моем 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, но я пытался сначала заставить его работать как положено ...

Ответы [ 2 ]

0 голосов
/ 02 июня 2018

То, что вы ищете, выглядит примерно так:

inline fun <reified T : Fragment> FragmentManager.findOrCreateFragment(): T {
    return fragments.find { it is T } as T? ?: T::class.java.newInstance()
}

Нет необходимости передавать ссылку на класс.

PS: Я уверен, что fragmentManager.getFragments() (илив Котлине fragmentManager.fragments) раньше был API с ограниченным доступом, но вы правы, это больше не так.

0 голосов
/ 02 июня 2018

Похоже, я мог бы сделать это без обобщений ... но после дальнейшего рассмотрения, использование обобщений, где я мог бы пойти 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...