android - 如何在 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
- 或使用支持 v4 库片段(稍作调整 - 使用 supportFragmentManager)
但是,如果目标 API 为 26 或更高,则 id 无法正常工作。如果目标 API 设置为 26,则共享元素不是动画的。相反,两个共享元素都会跳转到它们的结束位置,而其他所有内容都是动画的。
如何在不使用支持库的情况下使其工作?我错过了一些必须设置的属性吗?
解决方案
经过一些研究并感谢 Eugen Pechanec 的评论,我得出结论,使用 v4 支持库是可行的方法。API 版本 28 中已弃用平台片段,因此我们迟早必须进行迁移。
我不能说支持库完美无缺,但至少共享元素的过渡是动画的。
没有图书馆,我无法让它工作,我投入了很多时间。
推荐阅读
- dart - 打开定位服务而不导航到设置页面?飞镖
- php - 如何在 youtube api 上设置 enableAutoStart
- c++ - 需要帮助按“输入或换行”以允许用户返回主菜单
- rust - 为什么 AsRef 不能用作参数类型注释但可以用于泛型声明?
- javascript - Bootstrap 4 popper 未定义
- react-native - 使用 createBottomTabNavigator 将道具从一个屏幕传递到另一个屏幕
- java - Spring DevTools 不包含在使用 spring-boot-maven-plugin 打包的 fat jar 中
- ios - 我们可以扫描 Wi-Fi SSID 以获取他们在 iOS 中的接收信号强度 (RSS) 吗?
- itext7 - itext7 合并由 HtmlConverter.convertToDocument 创建的文档并保留大纲
- apache-kafka - SMT 时间戳转换器抛出 NullPointerException