首页 > 解决方案 > 如何在 Android 8 上使用 Fragment 过渡(API 26,Oreo)

问题描述

我正在使用 FragmentManager 通过共享元素转换(共享两个元素)将一个片段替换为另一个片段。这是代码(在 Kotlin 中):

private fun showList(edited: EditedAlarm) {
    fragmentManager.findFragmentById(R.id.main_fragment_container)?.apply{
        exitTransition = Fade()
    }

    // create a new Fragment and set transitions
    val listFragment = AlarmsListFragment().apply {
        sharedElementEnterTransition = moveTransition()
        enterTransition = Fade()
    }

    fragmentManager.beginTransaction()
            .addSharedElement(viewHolder.digitalClock(), "clock" + viewHolder.alarmId())
            .addSharedElement(viewHolder.container(), "onOff" + viewHolder.alarmId())
            .replace(R.id.main_fragment_container, listFragment)
            .commit()
}

Transitions 本身是这样定义的:

    private fun moveTransition(): TransitionSet {
    return TransitionSet().lollipop {
        ordering = TransitionSet.ORDERING_TOGETHER
        addTransition(ChangeBounds())
        addTransition(ChangeTransform())
    }
}

此代码仅在以下情况下适用于我的 Moto Z2 Play(Android 接近 AOSP)和我的摩托罗拉 One(Android ONE):

但是,如果目标 API 为 26 或更高,则 id 无法正常工作。如果目标 API 设置为 26,则共享元素不是动画的。相反,两个共享元素都会跳转到它们的结束位置,而其他所有内容都是动画的。

如何在不使用支持库的情况下使其工作?我错过了一些必须设置的属性吗?

标签: androidandroid-fragmentsandroid-animationandroid-transitionsfragmentmanager

解决方案


经过一些研究并感谢 Eugen Pechanec 的评论,我得出结论,使用 v4 支持库是可行的方法。API 版本 28 中已弃用平台片段,因此我们迟早必须进行迁移。

我不能说支持库完美无缺,但至少共享元素的过渡是动画的。

没有图书馆,我无法让它工作,我投入了很多时间。


推荐阅读