简体   繁体   English

如何在Android 8(API 26,Oreo)上使用片段过渡

[英]How to use Fragment transition on Android 8 (API 26, Oreo)

I am using a FragmentManager to replace one fragment with another with a shared element transition (two elements are shared). 我正在使用FragmentManager通过共享元素转换(共享两个元素)将一个片段替换为另一个片段。 Here is the code (in Kotlin): 这是代码(在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 itself is defined like this: 转换本身的定义如下:

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

This code works on my Moto Z2 Play (Android close to AOSP) and on my Motorola One (Android ONE) only if: 仅在以下情况下,此代码可在我的Moto Z2 Play(Android接近AOSP)和我的Motorola One(Android ONE)上运行。

  • Target API is lower than 26 目标API低于26
  • OR Support v4 Library Fragments are used (with minor adjustments - use supportFragmentManager) 或使用支持v4库片段(稍作调整-使用supportFragmentManager)

However, id does not work properly if target API is 26 or higher. 但是,如果目标API为26或更高版本,则id无法正常工作。 If target API is set to 26, shared elements are not animated . 如果将目标API设置为26,则共享元素不会设置为动画 Instead, both shared elements jump to their end positions while everything else is animated. 取而代之的是,两个共享元素都跳到了它们的最终位置,而其他所有元素都被动画化了。

How can I make it work without using the Support Library? 不使用支持库怎么办? Am I missing some attribute which has to be set? 我是否缺少一些必须设置的属性?

After some reasearch and thanks to the comment from Eugen Pechanec, I have concluded that using the v4 support library is the way to go . 经过一番研究,并感谢Eugen Pechanec的评论,我得出结论, 使用v4支持库是必经之路 Platform fragments are deprecated in API Versions 28, so we will have to mirgate sooner or later. API版本28中不推荐使用平台片段,因此我们迟早必须进行镜像。

I cannot say that support library works flawlessly, but at least shared elements transitions are being animated. 我不能说支持库可以完美地工作,但是至少共享元素的过渡是动态的。

I was not able to make it work without the library, having invested quite a lot of time. 我花了很多时间才能在没有图书馆的情况下使之工作。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何更改Android O / Oreo / api 26应用程序语言 - How to change Android O / Oreo / api 26 app language 如何在 Android 8.0 中正确更新小部件 - Oreo - API 26 - How To Properly Update A Widget In Android 8.0 - Oreo - API 26 通知无法在Android Oreo(API 26)中显示 - Notifications fail to display in Android Oreo (API 26) Android Oreo(API26)和android.app.DownloadManager - Android Oreo (API26) and android.app.DownloadManager 如何在Android 8.0 Oreo API 26及更高版本上检测到应用终止 - How can I detect app kill on Android 8.0 Oreo API 26 and after 如何在 Android Oreo API 26 及更高版本上检查设备是否具有低存储空间 - How to check if the device has Low Storage on Android Oreo API 26 and Above Android Oreo(API 26) - 在外部存储中创建目录 - Android Oreo (API 26) - Create dir in external storage onTaskRemoved()在Android 8.0 Oreo API级别26上不起作用 - onTaskRemoved() doesn't work on Android 8.0 Oreo API level 26 无法在 android oreo(API 级别 26)上以设备管理员身份激活应用 - Unable to activate app as device admin on android oreo(API level 26) Android API 26(Oreo)从Internet下载数据文件 - Android API 26 (Oreo) downloading data files from the Internet
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM