android Lollipop ViewGroup子层次结构更改?

时间:2015-06-03 16:21:14

标签: android android-5.0-lollipop viewgroup android-5.1.1-lollipop

我的应用程序的minSdk为15,我正在解决棒棒糖升级带来的所有错误。我们的软件非常复杂,它使用自定义ViewGroups动态创建视图,然后使用明确调整大小并放置在组内的元素数组。我遇到了一个问题,例如我将拥有一个ViewGroup,第一个子对象是一个Button ...这个按钮的大小可以填充视图(不可点击)。第二个子节点是包含单个视图的FrameLayout。此单个视图是视频对象。在Android的所有先前版本中,这可以正常工作。 FrameLayout分层在按钮上(用作背景),视频在framelayout内。您可以毫无问题地与视频互动。

棒棒糖发生了一些变化 - 突然,即使按钮显示为0索引元素,它仍然覆盖其余的孩子......所以我无法进入下面的视频。如果我删除该按钮元素,视频呈现并播放就好......我没有与它交互的问题。

我在UI Automator Viewer中运行应用程序只是为了确保我确实按照我的预期设置了UI(请记住,整个视图是在运行时使用图像/视频资源和xml配置文件动态呈现的)。

我无法共享代码,因为这是专有软件,但我正在开发一个小测试项目,看看我是否可以手动重新创建静态对象的问题。一旦我启动并运行,我一定会更新这张票。现在,这是层次结构的屏幕截图:

https://goo.gl/photos/a8on9CJDnN66XYnV6

注意突出显示的对象,这是自定义ViewGroup,它下面的子代是我上面描述的。

有没有人知道棒棒糖的变化会影响事物的排序?我之前发现,如果你有一个禁用的对象,但是没有为该对象分配禁用的状态drawable,它将变得不可见,以前的版本只使用了其他状态drawables ......这是有意义的,并且很容易修复,但这个对象不是不可见的...所以它必须是不同的东西。

任何方向都将不胜感激。 〜A

更新 - 修正

在@alanv和@BladeCoder的帮助下,我发现这个功能是由于Material设计的新高程功能。我能够通过首先检查设备使用的android版本来修复我的特定问题,如果是lollipop,我只是将这个新属性添加到按钮:

机器人:stateListAnimator = “@空”

这可以防止我的显式子层次结构被操作系统覆盖。

2 个答案:

答案 0 :(得分:1)

好的,更新!我想出了如何解决这个问题,虽然我还不确定(即使在grepcode中几个类之间的差异之后),在棒棒糖中发生了什么变化导致了它的工作方式发生了变化。

如果按钮已启用...并且您使用与AbsoluteLayout等效的东西(我们创建了自己的ViewGroup,我们创建了名为Explicit layout,但它与AbsoluteLayout完全相同),它将始终打开堆栈中其他任何东西的顶部也不是某种按钮(至少我发现的那些......我没有通过每个可能的小部件进行测试)。

将纯粹作为背景图像的按钮设置为enabled = false可解决此问题。我知道,我们使用Buttons作为背景图像是没有意义的,但我们的代码使用它来创建动态元素,因此每个元素都有许多可能的状态和用途。

无论如何,不​​确定是否还有其他人会遇到这个问题,但万一你这样做......这里是。

谢谢!

答案 1 :(得分:1)

Lollipop引入elevation作为在Z轴上定位元素的方法,并根据它们的高度差异在它们之间投射阴影。

启用按钮的默认高度为2dp(按下时会增加)。因此,您的按钮的高度高于FrameLayout(默认为0dp),因此它将在其上方绘制。

禁用按钮的高程为0dp。这就是禁用按钮解决问题的原因。

使用按钮作为背景看起来不是一个好主意(为什么不在FrameLayout上设置自定义Drawable背景呢?)但是如果你确实需要它,你可以像你一样禁用按钮,只是为了确保,将其提升强制为0dp。另一种解决方法是增加FrameLayout的高度,但如果它有背景,它可能会在Lollipop下投下一个大阴影,也许这不是你想要的。