Невозможно добавить фрагменты с помощью функции расширения Kotlin

У меня есть функция расширения Kotlin для добавления фрагмента, который находится в другом файле Kotlin.

fun Fragment.addFragment(tag: String?, id: Int, fragmentManager: FragmentManager) {
  // will take care of adding the fragment.
  val fragmentTransaction = fragmentManager.beginTransaction()
  fragmentTransaction.add(id, this, tag)
  fragmentTransaction.addToBackStack(tag)
  fragmentTransaction.commit()
}

Но всякий раз, когда я использую эту функцию расширения для добавления фрагмента, я получаю этот сбой

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v4.app.Fragment.setNextAnim(int)' on a null object reference

Я использую эту функцию расширения следующим образом:

MyFragment().addFragment("MyFragment", R.id.frame, fragmentMaganer)

После приведенного выше утверждения, если я попытался отладить свой код, он успешно выполнялся до тех пор, пока

fragmentTransaction.commit()

но после этого в методе onStart() моей деятельности я столкнулся с проблемой NullPointerException

Но если я использую тот же код непосредственно в Activity следующим образом:

val myFragment = MyFragment()
val fragmentTransaction = fragmentManager.beginTransaction()
fragmentTransaction.add(R.id.frame, myFragment, tag)
fragmentTransaction.addToBackStack(tag)
fragmentTransaction.commit()

тогда он работает нормально. Может кто-нибудь объяснить, почему он не работает с функцией расширения?


person pk4393    schedule 30.11.2017    source источник
comment
Вы ошиблись в написании fun Fragment.addFragment()?   -  person nhoxbypass    schedule 30.11.2017
comment
Нет, @nhoxbypass я этого не делал   -  person pk4393    schedule 30.11.2017
comment
Это неправильное использование расширения. Что вы сделали, так это создали экземпляр фрагмента только для того, чтобы использовать метод, который создает другой фрагмент. Я предполагаю, что вы приняли это за статические утилиты?   -  person Enzokie    schedule 30.11.2017
comment
@pk4393 да, это так   -  person Zoe    schedule 30.11.2017
comment
Функция расширения имела бы больше смысла, если бы вы создали эту функцию расширения в SupportFragmentManager как SupportFragmentManager.addFragment()   -  person Samuel Robert    schedule 04.12.2017


Ответы (1)


У меня также была такая же проблема, когда я создал отдельную функцию для создания и завершения фрагментов.

Но когда мое приложение закрывалось, я не создавал последнюю транзакцию для удаления оставшегося фрагмента.

Что я сделал, так это: перед завершением приложения удалите последний фрагмент, существующий через beginTransaction, и зафиксируйте. И ошибка перестала появляться.

Я думаю, что мое решение может дать вам некоторое представление.

person Alexandre Bianchi    schedule 26.12.2017