如何在ConstraintLayout中设置布局权重

9
我有4个视图,我需要将它们分为2组,然后使它们覆盖整个区域。
我尝试使用GroupchainStyle,但没有一种方法能够100%满足要求。
我希望得到以下效果: enter image description here 我已经做到了以下效果: enter image description here 下面是相应的代码:
<?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="wrap_content"
android:background="@color/colorBtnPink"
android:paddingTop="@dimen/_10sdp"
android:padding="@dimen/_10sdp">

<ImageView
    android:id="@+id/ivFb"
    android:layout_width="@dimen/_40sdp"
    android:layout_height="@dimen/_40sdp"
    android:background="@color/colorBgBtnFbDark"
    android:clickable="false"
    android:padding="@dimen/_10sdp"
    app:layout_constraintHorizontal_chainStyle="spread"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:srcCompat="@drawable/ic_facebook"
    tools:ignore="ContentDescription" />

<TextView
    android:id="@+id/tvFacebook"
    style="@style/tvSmallPopMedium"
    android:layout_width="0dp"
    android:layout_height="@dimen/_40sdp"
    android:background="@color/colorBgBtnFacebook"
    android:clickable="false"
    android:gravity="center"
    android:paddingBottom="@dimen/padding_regular"
    android:paddingTop="@dimen/padding_regular"
    android:text="@string/action_facebook"
    app:layout_constraintHorizontal_chainStyle="spread"
    app:layout_constraintLeft_toRightOf="@+id/ivFb"
    app:layout_constraintTop_toTopOf="parent" />


<ImageView
    android:id="@+id/ivTwitter"
    android:layout_width="@dimen/_40sdp"
    android:layout_height="@dimen/_40sdp"
    android:background="@color/colorBgBtnTwDark"
    android:clickable="false"
    android:padding="@dimen/_10sdp"
    app:layout_constraintHorizontal_chainStyle="spread"
    app:layout_constraintLeft_toRightOf="@+id/tvFacebook"
    app:layout_constraintTop_toTopOf="parent"
    app:srcCompat="@drawable/ic_twitter"
    tools:ignore="ContentDescription" />

<TextView
    android:id="@+id/tvTwitter"
    style="@style/tvSmallPopMedium"
    android:layout_width="0dp"
    android:layout_height="@dimen/_40sdp"
    android:background="@color/colorBgBtnTwitter"
    android:clickable="false"
    android:gravity="center"
    android:paddingBottom="@dimen/padding_regular"
    android:paddingTop="@dimen/padding_regular"
    android:text="@string/action_twitter"
    app:layout_constraintHorizontal_chainStyle="spread"
    app:layout_constraintLeft_toRightOf="@+id/ivTwitter"
    app:layout_constraintTop_toTopOf="parent" />
 </android.support.constraint.ConstraintLayout>

1
@ShivamKumar,我知道那个解决方案,但我想只使用ConstraintLayout来实现。 - buzzingsilently
2
将layout_width设置为0dp。这意味着视图的大小由约束确定。 - Tura
ConstraintLayout 提供了 app:layout_constraintWidth_percent 属性,但我无法在 4 个视图和 app:layout_constraintHorizontal_chainStyle 中管理它。 - buzzingsilently
1
@Tura 我应该将哪4个视图设置为0dp - buzzingsilently
1
@Umair 是的,只需进行轻微更改就可以运行了。 - buzzingsilently
显示剩余5条评论
5个回答

11

您也可以像这样使用guideLines属性:

<?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="wrap_content"
android:background="@color/colorBtnPink"
android:padding="@dimen/_10sdp"
android:paddingTop="@dimen/_10sdp">

<ImageView
    android:id="@+id/ivFb"
    android:layout_width="@dimen/_40sdp"
    android:layout_height="@dimen/_40sdp"
    android:background="@color/colorBgBtnFbDark"
    android:clickable="false"
    android:padding="@dimen/_10sdp"
    app:layout_constraintHorizontal_chainStyle="spread"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:srcCompat="@drawable/ic_facebook"
    tools:ignore="ContentDescription" />

<TextView
    android:id="@+id/tvFacebook"
    style="@style/tvSmallPopMedium"
    android:layout_width="0dp"
    android:layout_height="@dimen/_40sdp"
    android:background="@color/colorBgBtnFacebook"
    android:clickable="false"
    android:gravity="center"
    android:paddingBottom="@dimen/padding_regular"
    android:paddingTop="@dimen/padding_regular"
    android:text="@string/action_facebook"
    app:layout_constraintHorizontal_chainStyle="spread"
    app:layout_constraintLeft_toRightOf="@+id/ivFb"
    app:layout_constraintRight_toLeftOf="@id/ivTwitter"
    app:layout_constraintTop_toTopOf="parent" />


<android.support.constraint.Guideline
    android:id="@+id/guideline2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    app:layout_constraintGuide_percent="0.5" />


<ImageView
    android:id="@+id/ivTwitter"
    android:layout_width="@dimen/_40sdp"
    android:layout_height="@dimen/_40sdp"
    android:layout_marginLeft="8dp"
    android:layout_marginStart="8dp"
    android:background="@color/colorBgBtnTwDark"
    android:clickable="false"
    android:padding="@dimen/_10sdp"
    app:layout_constraintHorizontal_chainStyle="spread"
    app:layout_constraintLeft_toRightOf="@+id/tvFacebook"
    app:layout_constraintStart_toStartOf="@+id/guideline2"
    app:layout_constraintTop_toTopOf="parent"
    app:srcCompat="@drawable/ic_twitter"
    tools:ignore="ContentDescription" />

<TextView
    android:id="@+id/tvTwitter"
    style="@style/tvSmallPopMedium"
    android:layout_width="0dp"
    android:layout_height="@dimen/_40sdp"
    android:background="@color/colorBgBtnTwitter"
    android:clickable="false"
    android:gravity="center"
    android:paddingBottom="@dimen/padding_regular"
    android:paddingTop="@dimen/padding_regular"
    android:text="@string/action_twitter"
    app:layout_constraintHorizontal_chainStyle="spread"
    app:layout_constraintLeft_toRightOf="@+id/ivTwitter"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout> 

请查看这是否符合您的要求。


@buzzingsilently 是的,我给了你这个想法。很高兴它起作用了,编程愉快 :) - Umair

2
您需要按照以下方式修改您的代码:
<?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="wrap_content">

<ImageView
   android:id="@+id/ivFb"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:layout_marginStart="32dp"
   android:clickable="false"
   app:layout_constraintBottom_toBottomOf="parent"
   app:layout_constraintEnd_toStartOf="@+id/tvFacebook"
   app:layout_constraintHorizontal_bias="0.0"
   app:layout_constraintHorizontal_chainStyle="spread"
   app:layout_constraintStart_toStartOf="parent"
   app:layout_constraintTop_toTopOf="parent"
   app:srcCompat="@drawable/ic_android_black_24dp"
   tools:ignore="ContentDescription" />

<TextView
   android:id="@+id/tvFacebook"
   android:layout_width="0dp"
   android:layout_height="wrap_content"
   android:layout_marginEnd="16dp"
   android:clickable="false"
   android:gravity="center"
   android:text="Facebook"
   app:layout_constraintBottom_toBottomOf="@+id/ivFb"
   app:layout_constraintEnd_toStartOf="@+id/ivTwitter"
   app:layout_constraintHorizontal_bias="0.5"
   app:layout_constraintHorizontal_chainStyle="spread"
   app:layout_constraintStart_toEndOf="@+id/ivFb"
   app:layout_constraintTop_toTopOf="parent" />


<ImageView
   android:id="@+id/ivTwitter"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:layout_marginStart="16dp"
   android:clickable="false"
   app:layout_constraintBottom_toBottomOf="parent"
   app:layout_constraintEnd_toStartOf="@+id/tvTwitter"
   app:layout_constraintHorizontal_bias="0.5"
   app:layout_constraintHorizontal_chainStyle="spread"
   app:layout_constraintStart_toEndOf="@+id/tvFacebook"
   app:layout_constraintTop_toTopOf="parent"
   app:srcCompat="@drawable/ic_android_black_24dp"
   tools:ignore="ContentDescription" />

 <TextView
   android:id="@+id/tvTwitter"
   android:layout_width="0dp"
   android:layout_height="wrap_content"
   android:layout_marginEnd="32dp"
   android:clickable="false"
   android:gravity="center"
   android:text="Twitter"
   app:layout_constraintBottom_toBottomOf="@+id/ivTwitter"
   app:layout_constraintEnd_toEndOf="parent"
   app:layout_constraintHorizontal_bias="0.5"
   app:layout_constraintHorizontal_chainStyle="spread"
   app:layout_constraintStart_toEndOf="@+id/ivTwitter"
   app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>

它将看起来像这个

我修改了您的代码以安排约束布局中的元素,现在您可以根据需要修改代码 :)


1
在每个链接视图中,您不需要包含app:layout_constraintHorizontal_chainStyle="spread",您只需要将其添加到链中的第一个视图即可。 - Ace

0

这是解决方案:

<?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_marginTop="8dp"
    android:layout_height="wrap_content">
<RelativeLayout
    android:id="@+id/button_savewd"
    android:layout_width="0dp"
    android:layout_height="50dp"
    android:layout_marginBottom="8dp"
    android:layout_marginEnd="4dp"
    android:layout_marginStart="8dp"
    android:layout_marginTop="8dp"
    android:background="#3b5998"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintHorizontal_chainStyle="spread"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toLeftOf="@+id/asdfsff"
    tools:ignore="RtlCompat">
    <ImageView
        android:id="@+id/button_save"
        android:layout_width="50dp"
        android:layout_height="wrap_content"
        android:text="Facebook"
        tools:ignore="ContentDescription" />
    <Button
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentTop="true"
        android:layout_toEndOf="@+id/button_save"
        android:layout_toRightOf="@+id/button_save"
        android:background="@color/white"
        android:text="facebook"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toRightOf="@+id/button_save"
        app:layout_constraintRight_toRightOf="parent" />
</RelativeLayout>
<RelativeLayout
    android:id="@+id/asdfsff"
    android:layout_width="0dp"
    android:layout_height="50dp"
    android:layout_marginBottom="8dp"
    android:layout_marginEnd="8dp"
    android:layout_marginTop="8dp"
    android:layout_marginStart="4dp"
    android:background="#444"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toRightOf="@+id/button_savewd"
    app:layout_constraintRight_toRightOf="parent"
    tools:ignore="RtlCompat">
    <ImageView
        android:id="@+id/img_twitter"
        android:layout_width="50dp"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:src="@drawable/logo_0"
        android:text="Facebook"
        tools:ignore="ContentDescription" />
    <Button
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentTop="true"
        android:layout_toEndOf="@+id/img_twitter"
        android:layout_toRightOf="@+id/img_twitter"
        android:text="Twitter"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toRightOf="@+id/img_twitter"
        app:layout_constraintRight_toRightOf="parent" />
     </RelativeLayout>
 </android.support.constraint.ConstraintLayout>

将每个项目的宽度设置为0dp或MATCH_CONSTRAINT,可以让视图填充父容器(可选)。

enter image description here


你觉得为什么会在SDK中加入 ConstraintLayout 呢?!这正是为了让人们避免像你这样不必要地嵌套相对布局。此外,为什么你要在 RelativeLayout 的子项中包含 layout_constraintxxxx 属性呢?别再给错误的建议了,好吗? - Ace

0

使用chainStyle很简单,如果chainStyle=horizontal,则必须给出起始和结束约束条件,而对于chainStyle=vertical,则需要上下约束条件。


0

按照以下步骤操作:

  1. 选择您的小部件并将其设置为水平链
  2. 选择您的小部件并将其设置为水平居中
  3. 选择您的小部件并将其设置为组织(水平扩展)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接