Когда я меняю фрагмент и возвращаюсь к тому, который был в начале, запустив строку, я получаю сообщение об ошибке «Фрагмент не прикреплен к действию». Это странно, потому что до того, как я перейду к этой строке, я использую requireAcitivity (), и он отлично работает. Ошибка появляется после вызова пользовательского ArrayAdapter.

Когда я вызываю arrayadapter, метод requiredActivity по-прежнему работает:

val adapter = ListUserGameInfoAdapter(requireContext(), gameViewModel!!)
gameInfoListUsers.adapter = adapter

Каждая строка списка, созданного arrayAdapter, имеет кнопку.

icon.setOnClickListener {
     gameViewModel.userToDeleteFromGamePositionLiveData.value = position
}

Кнопка изменяет значение LiveData viewModel. Используя наблюдателя, я получаю это новое значение LiveData. Внутри кода наблюдателя, если я вызываю requiredActivity (), появляется следующая ошибка

        val userToDeleteObserver = Observer<Int> {
            if (it != null) {

                //If I call requiredActivity here, I get the error Fragment not attached to an activity

                showDialog(it)
            }
        }
        gameViewModel!!.userToDeleteFromGamePositionLiveData.observe(
            requireActivity(),
            userToDeleteObserver
        )

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

0
Chema 6 Апр 2021 в 03:30

1 ответ

Лучший ответ

Вы добавляете наблюдателя в свой фрагмент, но привязываете его к жизненному циклу своей деятельности. Поэтому он будет продолжать наблюдать за изменениями, даже когда фрагмент был уничтожен, поэтому вы получаете сбой при вызове requireActivity() в вашем наблюдателе.

Если вы выполните некоторую отладку, вы, вероятно, заметите, что наблюдатель на самом деле запускается дважды: один раз для старого фрагмента (больше не привязанного к действию) и один раз для нового фрагмента.

Вместо этого вам следует использовать Fragment.getViewLifecycleOwner().

1
Henry Twist 6 Апр 2021 в 01:15