Фрагмент отсоединяется при переносе ввода перехода - PullRequest
0 голосов
/ 09 января 2019

я столкнулся с проблемой Я использую переходы общего элемента с фрагментами, чтобы сделать анимацию типа галереи, где вы переходите от реселлера к viewpager и возвращаетесь с анимацией на правильном изображении, соответствующем тому, где вы остановились на пейджере представления, и это работает нормально. Моя проблема заключается в том, что для этого требуется отложить входные переходы, потому что я должен сначала загрузить все изображения, когда возвращаюсь к фрагменту повторного просмотра. Это странным образом приводит к тому, что мой фрагмент находится в состоянии «не присоединен» и «удаляется» при первой загрузке, это, в свою очередь, приводит к тому, что liveata не уведомляет об изменениях и ничего не загружается, страница остается пустой.

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    binding = DataBindingUtil.inflate(inflater, R.layout.fragment_user_list, container, false)
    binding.setLifecycleOwner(this)
    val view = binding.root
    prepareTransitions()
    postponeEnterTransition()

    return view
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    App.applicationComponent.inject(this)
    viewModel = ViewModelProviders.of(this, viewModelFactory)[UserListViewModel::class.java]
    communicationViewModel = ViewModelProviders.of(requireActivity())[UserListDetailCommViewModel::class.java]

    binding.viewModel = viewModel

    userRefresh.setProgressViewOffset(false, 0, 80.dp)

    setupRecyclerView()
    setFilterClick()

    subscribe()

    scrollToPosition()

    userRefresh.setOnRefreshListener {
        viewModel.updateUsers(true)
    }
}

private fun subscribe() {
    viewModel.users.observe(requireActivity(), Observer {
        println("reached user list fragment")
        when {
            it.error != null -> println(it.error)
            it.result != null -> {
                println("Reached fragment with result")
                println("Added: $isAdded, detached: $isDetached, removing: $isRemoving")
                if (isAdded && !isDetached && !isRemoving){
                    println("Showing users")
                    showUsers(it.result)
                }
            }
            else -> {
                println("Empty")
                TODO("Handle")
            }
        }
    })

    viewModel.me.observe(this, Observer {
        GlideApp.with(this).load(it.picture).error(R.drawable.round_placeholder).circleCrop().into(profilePicture)
    })
}

Как вы можете видеть из моего кода, я пытался использовать активность в качестве владельца жизненного цикла, чтобы понять, действительно ли это была проблема жизненного цикла фрагмента, и с ним работает обратный вызов liveata, но в результате фрагмент по-прежнему отключается и удаляется.

Бит startPostponedEnterTransition() находится в адаптере при загрузке фотографий

Может кто-нибудь помочь?

...