Java 在ConstraintLayout中的视图的所有方向上应用约束是否是最佳做法?

Java 在ConstraintLayout中的视图的所有方向上应用约束是否是最佳做法?,java,android,xml,android-constraintlayout,Java,Android,Xml,Android Constraintlayout,我有一个ConstraintLayout,显示为以下蓝图: 我已经意识到,并非所有的视图对象在所有方向上都有约束。例如,您将看到,RecyclerView在顶部没有约束。我的一些TextView对象也没有顶部和底部约束 当尝试在多个设备上扩展时,这会带来什么风险?是否有推荐的最佳实践?例如,现在我担心RecyclerView的顶部可能会在没有约束的情况下在更大的设备上“拉伸”。以下是XML: <?xml version="1.0" encoding="utf-8"?> <an

我有一个
ConstraintLayout
,显示为以下蓝图:

我已经意识到,并非所有的
视图
对象在所有方向上都有约束。例如,您将看到,
RecyclerView
在顶部没有约束。我的一些
TextView
对象也没有顶部和底部约束

当尝试在多个设备上扩展时,这会带来什么风险?是否有推荐的最佳实践?例如,现在我担心
RecyclerView
的顶部可能会在没有约束的情况下在更大的设备上“拉伸”。以下是XML:

<?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_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:id="@+id/imageView2"
        android:layout_width="113dp"
        android:layout_height="119dp"
        android:layout_marginBottom="31dp"
        android:layout_marginEnd="110dp"
        android:layout_marginLeft="110dp"
        android:layout_marginRight="110dp"
        android:layout_marginStart="110dp"
        android:layout_marginTop="16dp"
        app:layout_constraintBottom_toTopOf="@+id/textView2"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="0dp"
        android:layout_height="36dp"
        android:gravity="center"
        android:text="Polls Created"
        app:layout_constraintEnd_toStartOf="@+id/textView"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintHorizontal_weight=".33"
        app:layout_constraintStart_toStartOf="parent"
        tools:layout_editor_absoluteY="167dp" />

    <TextView
        android:id="@+id/textView3"
        android:layout_width="0dp"
        android:layout_height="36dp"
        android:gravity="center"
        android:text="Votes Given"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintHorizontal_weight=".33"
        app:layout_constraintStart_toEndOf="@+id/textView"
        tools:layout_editor_absoluteY="167dp" />


    <TextView
        android:id="@+id/textView"
        android:layout_width="0dp"
        android:layout_height="36dp"
        android:layout_marginTop="31dp"
        android:gravity="center"
        android:text="Votes Received"
        app:layout_constraintEnd_toStartOf="@+id/textView3"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintHorizontal_weight=".33"
        app:layout_constraintStart_toEndOf="@+id/textView2"
        app:layout_constraintTop_toBottomOf="@+id/imageView2" />

    <TextView
        android:gravity="center"
        android:id="@+id/textView5"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="1"
        app:layout_constraintEnd_toStartOf="@+id/textView4"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintHorizontal_weight=".33"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView2" />

    <TextView
        android:gravity="center"
        android:id="@+id/textView4"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        app:layout_constraintEnd_toStartOf="@+id/textView6"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintHorizontal_weight=".33"
        app:layout_constraintStart_toEndOf="@+id/textView5"
        app:layout_constraintTop_toBottomOf="@+id/textView" />

    <TextView
        android:gravity="center"
        android:id="@+id/textView6"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="3"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintHorizontal_weight=".33"
        app:layout_constraintStart_toEndOf="@+id/textView4"
        app:layout_constraintTop_toBottomOf="@+id/textView3" />


    <TextView
        android:id="@+id/textView7"
        android:layout_width="287dp"
        android:layout_height="36dp"
        android:layout_marginBottom="30dp"
        android:layout_marginEnd="48dp"
        android:layout_marginLeft="49dp"
        android:layout_marginRight="48dp"
        android:layout_marginStart="49dp"
        android:layout_marginTop="19dp"
        android:gravity="center_horizontal"
        android:text="USER X Recent polls"
        app:layout_constraintBottom_toTopOf="@+id/recyclerView"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView5" />

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="260dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"></android.support.v7.widget.RecyclerView>

</android.support.constraint.ConstraintLayout>

尽管您可以不受太多约束,但我认为在构建布局时添加所有必要的约束。这些约束将锚定您的视图,并确保它们出现在屏幕上的位置,以及它们的尺寸能够经得起未来的考验

例如,如果您有一个左/开始约束而没有右/结束约束,您将无法将视图的宽度设置为
match_constant
,它看起来就像是设置为
wrap_content
,甚至可以离开屏幕。您也将无法使用链接


如果缺少限制,布局编辑器将在右上角显示一个红色的解释标记,这些限制会阻止布局在设备上正确呈现。

虽然可以忽略一些限制,但我认为在构建布局时添加所有必要的限制。这些约束将锚定您的视图,并确保它们出现在屏幕上的位置,以及它们的尺寸能够经得起未来的考验

例如,如果您有一个左/开始约束而没有右/结束约束,您将无法将视图的宽度设置为
match_constant
,它看起来就像是设置为
wrap_content
,甚至可以离开屏幕。您也将无法使用链接

当您缺少阻止在设备上正确呈现布局的约束时,布局编辑器将在右上角显示一个红色解释标记。

这只是我的一个习惯

如果必须在视图项的所有四个面上定义约束,则
布局高度
布局宽度
将设置为0dp,这意味着
约束列表中的
匹配约束
。它可以通过“拉伸”视图来填充可用空间,从而根据约束调整视图项的大小

例如,您的
RecyclerView
可以定义为:

<android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_marginTop="8dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView7"></android.support.v7.widget.RecyclerView>

更改屏幕大小时,可以看到
Recyclerview
可以很好地调整大小

此外,我将避免直接在XML中定义
layout\u width
layout\u height
。如果您确实需要这样做,您可以使用dimens.xml并引用它。

这只是我的一个习惯

如果必须在视图项的所有四个面上定义约束,则
布局高度
布局宽度
将设置为0dp,这意味着
约束列表中的
匹配约束
。它可以通过“拉伸”视图来填充可用空间,从而根据约束调整视图项的大小

例如,您的
RecyclerView
可以定义为:

<android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_marginTop="8dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView7"></android.support.v7.widget.RecyclerView>

更改屏幕大小时,可以看到
Recyclerview
可以很好地调整大小


此外,我将避免直接在XML中定义
layout\u width
layout\u height
。如果您确实需要这样做,您可以使用dimens.xml并引用它。

这是我的习惯。正确使用百分比尺寸和指导线,以免直接放置边距。但是,有必要计算百分比,以便小部件不会重叠

<?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"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.constraint.Guideline
        android:id="@+id/topGl"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_percent=".05" />

    <android.support.constraint.Guideline
        android:id="@+id/textViewTopGl"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_percent=".35" />

    <ImageView
        android:id="@+id/imageView2"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintBottom_toTopOf="@+id/textView2"
        app:layout_constraintDimensionRatio="w,1:1"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="@id/topGl"
        app:layout_constraintHeight_percent=".25" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:gravity="center"
        android:text="Polls Created"
        app:layout_constraintEnd_toStartOf="@+id/textView"
        app:layout_constraintHeight_percent=".05"
        app:layout_constraintHorizontal_chainStyle="packed"
        app:layout_constraintHorizontal_weight="1"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="@id/textViewTopGl" />

    <TextView
        android:id="@+id/textView3"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:gravity="center"
        android:text="Votes Given"
        app:layout_constraintBottom_toBottomOf="@id/textView2"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_weight="1"
        app:layout_constraintStart_toEndOf="@+id/textView"
        app:layout_constraintTop_toTopOf="@id/textView2" />

    <TextView
        android:id="@+id/textView"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:gravity="center"
        android:text="Votes Received"
        app:layout_constraintBottom_toBottomOf="@id/textView2"
        app:layout_constraintEnd_toStartOf="@+id/textView3"
        app:layout_constraintHorizontal_weight="1"
        app:layout_constraintStart_toEndOf="@+id/textView2"
        app:layout_constraintTop_toBottomOf="@+id/imageView2"
        app:layout_constraintTop_toTopOf="@id/textView2" />

    <TextView
        android:id="@+id/textView5"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:gravity="center"
        android:text="1"
        app:layout_constraintEnd_toEndOf="@id/textView2"
        app:layout_constraintHeight_percent=".05"
        app:layout_constraintStart_toStartOf="@id/textView2"
        app:layout_constraintTop_toBottomOf="@id/textView2" />

    <TextView
        android:id="@+id/textView4"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:gravity="center"
        app:layout_constraintBottom_toBottomOf="@id/textView5"
        app:layout_constraintEnd_toEndOf="@id/textView"
        app:layout_constraintStart_toStartOf="@id/textView"
        app:layout_constraintTop_toTopOf="@id/textView5" />

    <TextView
        android:id="@+id/textView6"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:gravity="center"
        android:text="3"
        app:layout_constraintBottom_toBottomOf="@id/textView5"
        app:layout_constraintEnd_toEndOf="@id/textView3"
        app:layout_constraintStart_toStartOf="@id/textView3"
        app:layout_constraintTop_toTopOf="@id/textView5" />

    <TextView
        android:id="@+id/textView7"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:gravity="center"
        android:text="USER X Recent polls"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHeight_percent=".05"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView5" />

    <android.support.constraint.Guideline
        android:id="@+id/recyclerViewTopGl"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_percent=".53" />

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="@id/recyclerViewTopGl" />

</android.support.constraint.ConstraintLayout>


这是我的习惯。正确使用百分比尺寸和指导线,以免直接放置边距。但是,有必要计算百分比,以便小部件不会重叠

<?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"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.constraint.Guideline
        android:id="@+id/topGl"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_percent=".05" />

    <android.support.constraint.Guideline
        android:id="@+id/textViewTopGl"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_percent=".35" />

    <ImageView
        android:id="@+id/imageView2"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintBottom_toTopOf="@+id/textView2"
        app:layout_constraintDimensionRatio="w,1:1"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="@id/topGl"
        app:layout_constraintHeight_percent=".25" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:gravity="center"
        android:text="Polls Created"
        app:layout_constraintEnd_toStartOf="@+id/textView"
        app:layout_constraintHeight_percent=".05"
        app:layout_constraintHorizontal_chainStyle="packed"
        app:layout_constraintHorizontal_weight="1"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="@id/textViewTopGl" />

    <TextView
        android:id="@+id/textView3"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:gravity="center"
        android:text="Votes Given"
        app:layout_constraintBottom_toBottomOf="@id/textView2"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_weight="1"
        app:layout_constraintStart_toEndOf="@+id/textView"
        app:layout_constraintTop_toTopOf="@id/textView2" />

    <TextView
        android:id="@+id/textView"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:gravity="center"
        android:text="Votes Received"
        app:layout_constraintBottom_toBottomOf="@id/textView2"
        app:layout_constraintEnd_toStartOf="@+id/textView3"
        app:layout_constraintHorizontal_weight="1"
        app:layout_constraintStart_toEndOf="@+id/textView2"
        app:layout_constraintTop_toBottomOf="@+id/imageView2"
        app:layout_constraintTop_toTopOf="@id/textView2" />

    <TextView
        android:id="@+id/textView5"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:gravity="center"
        android:text="1"
        app:layout_constraintEnd_toEndOf="@id/textView2"
        app:layout_constraintHeight_percent=".05"
        app:layout_constraintStart_toStartOf="@id/textView2"
        app:layout_constraintTop_toBottomOf="@id/textView2" />

    <TextView
        android:id="@+id/textView4"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:gravity="center"
        app:layout_constraintBottom_toBottomOf="@id/textView5"
        app:layout_constraintEnd_toEndOf="@id/textView"
        app:layout_constraintStart_toStartOf="@id/textView"
        app:layout_constraintTop_toTopOf="@id/textView5" />

    <TextView
        android:id="@+id/textView6"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:gravity="center"
        android:text="3"
        app:layout_constraintBottom_toBottomOf="@id/textView5"
        app:layout_constraintEnd_toEndOf="@id/textView3"
        app:layout_constraintStart_toStartOf="@id/textView3"
        app:layout_constraintTop_toTopOf="@id/textView5" />

    <TextView
        android:id="@+id/textView7"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:gravity="center"
        android:text="USER X Recent polls"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHeight_percent=".05"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView5" />

    <android.support.constraint.Guideline
        android:id="@+id/recyclerViewTopGl"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_percent=".53" />

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="@id/recyclerViewTopGl" />

</android.support.constraint.ConstraintLayout>


如何将内容区域和RecyclerView划分为两个区域,对RecyclerView应用百分比高度,并对内容区域中的小部件使用百分比高度和百分比宽度?根据分辨率,字体大小只是尺寸的一个分支。当你说分为两个区域时,你的意思是什么?我认为
ConstraintLayout
的目的之一是消除嵌套视图。我同意您的想法。我的意思不是将它们分成两个视图组,而是将RecyclerView的高度应用于percent,将剩余的上部区域应用于剩余的percent值(视情况而定)。根据我的经验,在许多情况下,应用percent属性比将维度设置为dp要灵活得多。我想说得更深入一些,但很抱歉我的英语不好。你能发布你所指的示例代码/xml吗?我知道如何设置权重,但我是否也需要为顶部创建一个
框架布局
?如何将内容区域和RecyclerView划分为两个区域,对RecyclerView应用百分比高度,并对内容区域中的小部件使用百分比高度和百分比宽度?根据分辨率,字体大小只是尺寸的一个分支。当你说分为两个区域时,你的意思是什么?我认为
ConstraintLayout
的目的之一是消除嵌套视图。我同意您的想法。我的意思不是将它们分成两个视图组,而是将RecyclerView的高度应用于percent和remaini