是否建议在 Android 的 ConstraintLayout 中使用 LinearLayout?

Posted

技术标签:

【中文标题】是否建议在 Android 的 ConstraintLayout 中使用 LinearLayout?【英文标题】:Is it advisable to use LinearLayout inside ConstraintLayout in Android? 【发布时间】:2018-01-19 10:03:32 【问题描述】:

我是 androidConstraintLayout 的新手,也是 Android 的新手。我有个问题。在ConstraintLayout 中使用LinearLayout 是否可取?例如:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    app:srcCompat="@drawable/landing_screen"
    android:layout_
    tools:context="com.braigolabs.braigo.landing.LandingActivity">

    <ImageView
        android:id="@+id/imageView"
        android:layout_
        android:layout_
        android:scaleType="centerCrop"
        app:srcCompat="@drawable/landing_screen"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintVertical_bias="1.0"
        app:layout_constraintHorizontal_bias="1.0"
        tools:layout_constraintTop_creator="1"
        tools:layout_constraintRight_creator="1"
        tools:layout_constraintBottom_creator="1"
        tools:layout_constraintLeft_creator="1"/>

    <LinearLayout
        android:layout_
        android:layout_
        android:orientation="horizontal"
        tools:layout_editor_absoluteX="0dp"
        tools:layout_editor_absoluteY="51dp">

        <TextView
            android:id="@+id/textView"
            android:layout_
            android:layout_
            android:layout_marginEnd="66dp"
            android:layout_marginStart="66dp"
            android:gravity="center"
            android:text="@string/login_welcome_braigolabs"                android:textAppearance="@style/TextAppearance.AppCompat.Large"
            tools:layout_editor_absoluteX="93dp"
            tools:layout_editor_absoluteY="403dp"/>

        <Button
            android:id="@+id/login_button"
            style="@style/Widget.AppCompat.Button.Colored"
            android:layout_
            android:layout_
            android:elevation="2dp"
            android:text="@string/login_login_button_title"
            android:textAllCaps="false"
            tools:layout_editor_absoluteX="116dp"
            tools:layout_editor_absoluteY="543dp"/>
    </LinearLayout>
</android.support.constraint.ConstraintLayout>

还想知道ConstraintLayout 在开发人员中的受欢迎程度吗?

【问题讨论】:

我认为至少 AppCompatTextView 如果视图被包裹在线性布局中,它的渲染速度会明显更快.. 大量视图会更明显 【参考方案1】:

在 ConstraintLayout 中使用 LinearLayout 是否可取?

不...通常。

一般来说,ConstraintLayout 背后的想法是,它允许您定位所有孩子,而无需在 ConstraintLayout 中嵌套任何其他 ViewGroups。因此,我会说这不是可取的

但是,LinearLayout 可以做到ConstraintLayout 无法做到的一些事情(主要围绕视图的加权间距),因此如果您需要这些特殊的极端情况在您的布局中,除了退回到 LinearLayout 之外,您别无选择。

ConstraintLayout 在开发者中有多受欢迎?

ConstraintLayout 相对较新,但它非常强大,当然你应该熟悉它。它并不总是适合手头工作的完美工具,但它通常可以让您轻松创建原本需要花费数小时才能完成的布局。

我无法谈论广泛采用的统计数据,但我可以说我在这个网站上看到了大量关于 ConstraintLayout 正确用法的问题,因此很明显世界各地的开发人员都开始使用它。

【讨论】:

完美。谢谢@Ben。为什么有人投反对票?这是一个相当相关的问题。 我不能肯定地说,但我相信您的问题从广义上讲是征求意见,而不是提出具体的编程问题。这通常被认为是题外话。 我们可以嵌套 ConstraintLayout 的吗? @IgorGanapolsky 当然。同样,嵌套约束布局在某种程度上违背了使用约束布局来实现完全平坦的视图层次结构的想法。但肯定会有嵌套视图使您的代码更具可读性和可维护性的情况。【参考方案2】:

constraintlayout 库的2.0.0-alpha5 版本开始,现在可以在ConstraintLayout 中声明Flow 虚拟布局元素,它(顾名思义)决定了所选项目的流动方式(例如垂直,水平)在ConstraintLayout 内。因此不再需要在您的ConstraintLayout 中声明LinearLayout

例如,如果您希望 ConstraintLayout 中的项目垂直流动,您可以这样做:

<androidx.constraintlayout.widget.ConstraintLayout
    android:layout_
    android:layout_>

    <TextView
        android:id="@+id/textView1"
        android:layout_
        android:layout_
        android:text="I am the first TextView" />

    <TextView
        android:id="@+id/textView2"
        android:layout_
        android:layout_
        android:text="I am the second TextView" />

    <TextView
        android:id="@+id/textView3"
        android:layout_
        android:layout_
        android:text="I am the third TextView" />

    <androidx.constraintlayout.helper.widget.Flow
        android:layout_
        android:layout_
        android:orientation="vertical"
        app:constraint_referenced_ids="textView1,textView2,textView3"
        app:flow_horizontalAlign="start"
        app:flow_verticalGap="8dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

您可以在Flow 元素中使用app:flow_ 属性来实现不同的流行为。有关Flow 元素的更多信息,请参阅发行说明here。示例见here。

【讨论】:

以上是关于是否建议在 Android 的 ConstraintLayout 中使用 LinearLayout?的主要内容,如果未能解决你的问题,请参考以下文章

xcode中使用xib添加autolayout中constrain to margins的不同

固定原子层脚本Atom_constrain.py介绍

是否可以从 android2.2 应用程序中的谷歌地图获取建议的路线?

mysql ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constrain fails

Android中是否推荐使用枚举Enum

Constraint Layout 约束布局基础使用