推迟进入过渡时片段分离

时间:2019-01-08 21:10:32

标签: android android-fragments android-lifecycle android-livedata shared-element-transition

我遇到了问题 我正在使用带有片段的共享元素过渡来创建画廊类型的动画,在该动画中,您从recyclerview转到viewpager,然后将动画与正确的图片一起返回,该图片与您在view pager上停止的位置相对应,并且可以正常工作。我的问题是,这样做需要推迟输入转换,因为返回到recyclerview片段时,我必须先加载所有图像。奇怪的是,这使我的片段在第一次加载时处于“未连接”和“正在删除”状态,这又导致livedata无法通知更改且没有加载,页面仍然空白。

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)
    })
}

从我的代码中可以看到,我尝试使用活动作为生命周期所有者,以了解它是否确实是片段生命周期问题,并使用livedata回调起作用,但片段仍会分离并删除。

加载照片后,startPostponedEnterTransition()位在适配器中

有人可以帮忙吗?

0 个答案:

没有答案