【问题标题】:Nested Constraint Layout? is it a bad practice or not?嵌套约束布局?这是一个不好的做法吗?
【发布时间】:2018-12-17 10:59:02
【问题描述】:

我对@9​​87654321@的使用有一个灰色地带。

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

所以一般来说嵌套Constraint Layout 是否可以,否则就其目的而言(即具有平面布局)将是错误的做法?

编辑

在答案中,建议为每个视图设置侦听器,而不是为其父布局设置侦听器,我已经测试过这种方法,这不是我需要的。一个例子是,当我有一个带有文本和可绘制对象的自定义按钮时(我无法使用按钮本身的drawableLeftdrawableRight 属性来实现它,因为它看起来不像我们设计的那样)。如您所见,我不能让ImageViewTextView 分别监听点击,因为用户会看到两种不同的点击效果,而且看起来不像是单次点击。

【问题讨论】:

    标签: android android-constraintlayout


    【解决方案1】:

    基于来自 Android 开发者博客的 this 文章。我想提几点。您可以阅读完整的文章并自行决定,但我想提几个关键点。

    1. android如何绘制Views

    当用户将 Android 视图置于焦点位置时,Android 框架 指示视图自行绘制。此绘图过程包括 3 阶段:

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

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

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

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

    【讨论】:

    • 您的理解究竟是基于什么?因为您在此处引用的所有内容都没有考虑嵌套
    • @TimCastelijns : 虽然绘图视图系统需要自上而下遍历视图树,因此绘制特定视图需要更多的嵌套、更多的时间和计算能力。
    • @KaranMer 我已经编辑了我的问题并解释了为什么我不能为每个视图设置监听器。
    • @Merka :您可以继续使用您的方法。
    • 这很可能是一个异常值,但我们在以前使用嵌套 ConstraintLayouts 的复杂且大型布局中将测量+布局时间从 1.5 秒缩短到 非常的显着提升(无论是在启动时间还是 CPU 使用率方面)。
    【解决方案2】:

    我不会嵌套多个约束布局,因为这会否定您提到的平坦度的目的,但如果它只是一个,我不会担心内存效率和平坦度。不过,作为一种解决方案,您可以包含一个透明视图来覆盖您想要响应单击的组,并让该覆盖视图吸收点击。您所要做的就是将其约束到其他视图的边缘并仍然保持一个父约束布局。

    编辑:在您更新问题后,我认为您别无选择,只能创建嵌套布局。 Lint 将嵌套布局的最大数量设置为 10,因此仅此一项就是嵌套布局可能损害整体性能的阈值指标。我不会太担心一种嵌套布局。您可以将systrace 用于您的场景,并看到时间差异可能微不足道。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 我已经编辑了我的问题并解释了为什么我不能为每个视图设置监听器。它不会产生设计中预期的效果。
      • 你应该尝试扩展按钮并以你的方式创建它,这样你就不会有嵌套布局。这可能有点矫枉过正,但它回答了你的问题
      • 是的,它会解决一个按钮,但我有不同设计的不同按钮。此外,我还有其他情况,它不是按钮,但我需要类似的行为。我希望Constraint Layout 中的一些功能可以在没有嵌套布局的情况下实现。这种设计要求破坏了Constraint Layout的理念。
      • 组旨在保持可见性,而不是点击事件。这不是一个好的设计(您无法实现多个视图的点击效果,...)。
      猜你喜欢
      • 2019-03-29
      • 1970-01-01
      • 1970-01-01
      • 2022-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-12
      • 2014-04-30
      相关资源
      最近更新 更多