替换片段具有错误的高程值

zaf*_*ani 16 android android-fragments fragmenttransaction android-transitions fragment-animation

你好再次堆栈溢出.我有另一个片段问题.(我正在使用android.app.Fragment而不支持片段)

我正在尝试更换片段.但这不像使用那么简单:

fragmentTransaction
    .replace(containerId, newFragment)
    .addToBackStack("unique tag")
    .commit()
Run Code Online (Sandbox Code Playgroud)

为什么不?好朋友问,因为我newFragment有过渡动画.

动画在哪里定义?另一个很棒的问题,它在碎片onCreateAnimator()中定义

为什么在那里定义?可以找到原因的长答案:嵌套片段转换不正确.现在你需要相信这就是我的项目需要做的事情.

动画是做什么的?从屏幕边缘到其中心的简单滚动,完全覆盖原始片段.请记住,在这种情况下,旧片段只是坐在原地.它具有不移动的动画效果.


问题是什么?

问题是newFragment似乎比旧版本具有更低的高程(或z?)值.因此,无法观察到过渡,因为旧片段位于新片段上方.到达动画持续时间结束时,您会看到新片段在旧片段上方闪烁.我期望newFragment从动画开始就覆盖旧版本.


为什么不使用添加?这似乎会产生更多问题,因为我有很多片段要交换进出视图.使用add似乎会在下次使用replace时触发它们的退出动画,即使前面有1 ... n个片段.他们也不会停顿.

为什么不设置高程?因为我支持没有提升属性的api 19.

为什么不对api 19使用ViewCompat.setElevation()?我尝试了它并且有相同的失败结果.

有没有人找到解决这个问题的方法?

Dim*_*zis 5

我遇到了同样的问题,花了很多时间来修复它.不幸的是,根据我的经验,在此设置中无法使API <= 19.

ViewCompat.setElevation()对于<= 19 API来说,它只是一个NoOp,所以它无法工作.从SDK 21开始,它设置了一个高程,它有点修复了问题.设置Z索引也可以.

我唯一可以建议的是将API <= 19的转换更改为不依赖于Z索引.21岁以上的人可以使用您想要的过渡.这就是我这样做的方式,我认为这很好,因为大多数用户都是21岁以上.