Вызов конструктора Fragment вызвал исключение. Компонент навигационной архитектуры - PullRequest
0 голосов
/ 05 января 2019

Я использую библиотеку компонентов архитектуры навигации, и отправной точкой моего приложения является следующий фрагмент:

class MainFragment : BaseFragment() {

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        return inflater.inflate(R.layout.fragment_main, container, false)
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    }
}

Который наследует от абстрактного класса BaseFragment:

abstract class BaseFragment : Fragment() {

}

Когда я запускаю свое приложение, я получаю:

 Unable to instantiate fragment io.example.MainFragment: calling Fragment constructor caused an exception

Но этого не происходит, если MainFragment расширяет Fragment вместо BaseFragment. Какова причина? Это как-то связано с работой компонента архитектуры навигации?

Ответы [ 2 ]

0 голосов
/ 09 июля 2019

У меня была такая же проблема, но только на старых версиях Android. Оказалось, что мне пришлось использовать прямой потомок Fragment() Не могу сказать вам, почему это было проблемой, так как она работала нормально на более новых версиях, но у меня не было выбора, кроме как рефакторинг ... болезненный, но теперь функциональный.

0 голосов
/ 26 июня 2019

У меня была похожая проблема, потому что у меня было val в MyBaseFragment

protected abstract val gpsMsg: String

, который я перебирал таким образом в другом Фрагменте перед фрагментом, прикрепленным к контексту.

override val gpsMsg: String = getString(R.string.gps_not_enabled)

Таким образом, основной ошибкой было то, что контекст был нулевым, а getString использует getResources(), который возвращает requireContext().getResources(). А в исходном коде requireContext() будет выдана ошибка.

public final Context requireContext() {
    Context context = getContext();
    if (context == null) {
        throw new IllegalStateException("Fragment " + this + " not attached to a context.");
    }
    return context;
}

Таким образом, выданная ошибка приводит к тому, что фрагмент не создается. Поэтому я бы посоветовал быть осторожным с контекстом при переопределении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...