替换碎片时高度值错误。

16

大家好,我又来问关于Fragment的问题了(我正在使用android.app.Fragment而不是Support Fragments)。

我想要替换一个Fragment。但这并不像使用以下代码那么简单:

fragmentTransaction
    .replace(containerId, newFragment)
    .addToBackStack("unique tag")
    .commit()

为什么不这样做? 好问题,朋友们。这是因为我的newFragment有一个过渡动画。

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

为什么要在那里定义? 为什么的长答案可以在 嵌套片段转换不正确 中找到。现在你需要相信这是我项目中需要这样做的方式。

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


问题是什么?

问题在于newFragment似乎具有比旧的更低的高度(或z值)。因此,转换无法被观察到,因为旧片段位于新片段上方。在动画持续时间结束时,您会看到新片段在旧片段上方闪烁。我希望newFragment从动画开始就覆盖旧的。


为什么不使用add?这似乎会带来更多问题,因为我有许多片段想要在视图中交换。使用add似乎会在下一次使用replace时触发它们的退出动画,即使它们前面有1...n个片段。它们也不会暂停。

为什么不设置高度?因为我支持api 19,它没有高度属性。

为什么不使用ViewCompat.setElevation()对于api 19?我尝试了它,但结果仍然失败。

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


在提交事务之前,您是否尝试过应用 setReorderingAllowed(false)?(参考链接:https://developer.android.com/reference/android/support/v4/app/FragmentTransaction.html#setReorderingAllowed(boolean)) - azizbekian
对于框架片段,请使用 setAllowOptimization(false) - azizbekian
你使用Fragments而不是Support Fragments的原因是什么? - Tobias Ettrup Mølbak
我不支持19之前的API。 - zafrani
我们在两个片段和动画方面做的非常相似。唯一的区别是我们不是对片段进行动画处理,而是对其中的内容进行动画处理。因此,基本上我们会将底部片段的内容动画化(同时使顶部片段的所有子元素不可见)。在底部片段的动画完成后,我们开始顶部片段的动画,并移除底部片段,以实现片段之间的无缝过渡。不知道这对你是否有用,但值得一试。 - the-ginger-geek
显示剩余9条评论
1个回答

5
我曾经遇到相同的问题,花费了不少时间试图解决它。不幸的是,从我的经验来看,在这个设置中无法使其在API <= 19上工作。
对于API <= 19,ViewCompat.setElevation()只是一个NoOp,因此它无法工作。从SDK 21开始,它可以设置高程并且有点修复了这个问题。设置Z索引也可以起作用。
我唯一能给出的建议是,将API <= 19的过渡更改为不依赖于Z索引。而对于21+,使用你想要的过渡。这是我做的方式,我认为这很好,因为大多数用户都在21+。

我很抱歉,这是我唯一的选择。 - zafrani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接