嵌套约束布局?这是不好的做法吗?

时间:2018-12-17 10:59:02

标签: android android-constraintlayout

我在理解z-index的用法方面有一个灰色区域。

我已经用Constraint Layout实现了布局。但是碰巧我想让一组视图项充当一个视图,例如使两个Constraint Layout和一个ImageView像单个视图一样响应点击,因此我需要放置它们放在另一个布局中,并使用此布局来响应点击。 我想知道是否可以将它们放在另一个TextView中(其他布局无法提供我想要的视图的布局),这会导致将Constraint Layout嵌套在单个布局中。

因此嵌套Constraint Layout通常是正确的做法,还是出于错误的目的(即采用扁平布局)?

修改

在答案中,建议为每个视图设置侦听器,而不是为其父布局设置侦听器,我已经测试了这种方法,这不是我所需要的。例如,当我有一个带有文本和可绘制内容的自定义按钮时(我无法使用按钮本身的Constraint LayoutdrawableLeft属性,因为它看起来不像我们设计的那样),因此如您所见,我无法让drawableRightImageView单独听点击,因为用户会看到两种不同的点击效果,而不会像单击一个按钮一样。

3 个答案:

答案 0 :(得分:1)

我不会嵌套多个约束布局,因为那样会否定如您所提到的平坦性的目的,但是,如果仅仅是一个约束,我就不必担心内存效率和平坦性。但是,作为解决方案,您可以包括一个透明视图以覆盖您希望对单击做出响应的组,并使该覆盖视图吸收该单击。您所要做的就是将其约束到其他视图的边缘,并且仍然保持一个父约束布局。

编辑:更新问题后,我认为除了创建该嵌套布局外,别无选择。 Lint的最大嵌套布局数设置为10,因此,这仅是嵌套布局可能损害整体性能的阈值的指标。我不会过多担心一种嵌套布局。您可以针对自己的情况使用systrace,以了解时间差异可能不明显。

答案 1 :(得分:1)

基于android开发人员博客中的this文章。我想提几件事。您可以阅读完整的文章并自己决定,但我想提几个要点。

1。 android如何绘制视图

  

当用户将Android视图作为焦点时,Android框架   引导视图进行绘制。该绘制过程包括3   阶段:

  1. 测量:测量视图和视图组。
  2. 布局:根据度量确定子视图的位置。
  3. 绘制:为每个对象创建画布并绘制视图。
  

绘制过程中的每个阶段都需要从上到下遍历   视图树。因此,您彼此嵌入的视图更多   (或嵌套)到视图层次结构中,则时间和计算能力越多   设备需要绘制视图。通过保持平坦的层次结构   在您的Android应用布局中,您可以创建一个快速响应的用户   您的应用程序的界面。

作为约束布局,您可以创建一个平面层次结构,该层次结构将使用较少的计算能力,并且速度更快。根据针对传统布局执行的测试结果,您可以在下面看到结果。

enter image description here

基于我对布局工作方式和约束布局行为的理解,您嵌套的约束布局将比所有传统布局都要快,但是由于嵌套的原因,它比完整的平面层次结构要慢。另外,为了实现允许用户点击的目标,为什么不将点击侦听器设置为应该为您使用的视图。

答案 2 :(得分:0)

可能您想在约束布局中创建一个Group并为其设置一个点击监听器。

检查此答案的可接受答案。 Use group in ConstraintLayout to listen for click events on multiple views