У меня есть функция расширения 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()
то его работая отлично. Может кто-нибудь объяснить, почему он не работает с функцией расширения ?
У меня также была та же проблема, когда я создал отдельную функцию для создания и завершения фрагментов.
Но когда мое приложение уходило, я не создавал последнюю транзакцию для удаления оставшегося фрагмента.
Я сделал следующее: Перед завершением приложения удалите последний фрагмент, существующий через beginTransaction и commit. И ошибка прекратилась.
Я думаю, что мое решение может дать вам некоторую идею.
По моим сведениям,
fragmentManager . beginTransaction () ;
Начните серию операций редактирования на фрагментах, связанных с этим FragmentManager.
Поэтому вам нужно выполнить эту задачу перед добавлением какого-либо фрагмента.
Чтобы выполнить транзакцию, такую как добавление или удаление фрагмента, вы должны использовать FragmentManager для создания одного FragmentTransaction , который предоставляет API для добавления, удаления, замены и выполнения других транзакций snippet.