【问题标题】:Constraining dynamic sized views to bottom of a view in ConstraintLayout在 ConstraintLayout 中将动态大小的视图约束到视图的底部
【发布时间】:2019-04-09 16:41:52
【问题描述】:

我有一个设计要求的布局,例如:

关闭按钮必须在上面,下面是ImageViewTextViewTextView 的大小是动态的,取决于数据库中保存的内容。 ImageViewTextView 都必须像第一张图片一样位于关闭按钮下方,并且:

如果反过来,我可以使用 Barrierbottom 方向,并参考 ImageViewTextView 的 ID 以将关闭按钮定位到,但情况正好相反现在。

有没有办法在不将ImageViewTextView 嵌套在另一个布局中(例如LinearLayout)的情况下执行此视图?尝试实现非嵌套视图,因为我正在使用ConstraintLayout..

提前致谢!

编辑:

这是一个测试布局

<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/layout_root"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="16dp"
    android:paddingTop="20dp"
    android:paddingRight="16dp">

    <ImageView
        android:id="@+id/waste_type_close"
        android:layout_width="24dp"
        android:layout_height="24dp"
        android:src="@drawable/ic_account_alert_grey600_24dp"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <ImageView
        android:id="@+id/waste_type_image"
        android:layout_width="84dp"
        android:layout_height="84dp"
        android:layout_marginLeft="20dp"
        android:src="@drawable/ic_account_alert_black_48dp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/waste_type_close" />

    <TextView
        android:id="@+id/waste_type_name"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginLeft="12dp"
        android:text="name"
        android:textSize="30sp"
        android:textStyle="bold"            
        app:layout_constraintBottom_toBottomOf="@+id/waste_type_image"
        app:layout_constraintLeft_toRightOf="@+id/waste_type_image"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="@+id/waste_type_image" />

</ConstraintLayout>

编辑:

这是另一个测试布局:

<ImageView
    android:id="@+id/waste_type_close"
    android:layout_width="24dp"
    android:layout_height="24dp"
    android:src="@drawable/ic_account_alert_grey600_24dp"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintBottom_toTopOf="@+id/waste_type_barrier"/>

<ImageView
    android:id="@+id/waste_type_image"
    android:layout_width="84dp"
    android:layout_height="84dp"
    android:layout_marginLeft="20dp"
    android:src="@drawable/ic_account_alert_black_48dp"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/waste_type_close" />

<TextView
    android:id="@+id/waste_type_name"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_marginLeft="12dp"
    android:text="nameaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
    android:textSize="30sp"
    android:textStyle="bold"
    app:layout_constraintBottom_toBottomOf="@+id/waste_type_image"
    app:layout_constraintLeft_toRightOf="@+id/waste_type_image"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="@+id/waste_type_image" />

<android.support.constraint.Barrier
    android:id="@+id/waste_type_barrier"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:barrierDirection="top"
    app:constraint_referenced_ids="waste_type_image, waste_type_name"/>

产生:

【问题讨论】:

  • 设置障碍有什么问题?

标签: android android-constraintlayout


【解决方案1】:

放置一个限制在关闭按钮下方的屏障并将一个约束放置在下面的项目(imageview 和 textview)被限制到屏障底部的地方应该这样做。对于动态文本视图,只需在 Imageview 上创建一个相对于文本视图开始的约束。

【讨论】:

  • CMIIW,但放置仅引用一项的障碍与仅限制以下一项相同吗?关于动态TV,我需要使用IV 使其成为center_vertical。我还没有尝试使用两个顶级约束,让我在几秒钟内尝试一下 - 编辑:是的,它没有t 工作,我发布一个测试布局,让人们更容易尝试
  • 是的,这意味着这两个视图会“粘”在障碍上,对吧?我需要它是center_vertical :\
  • center_vertical 相对于屏障和 parent_bottom?
  • 不,想象这两个视图在LinearLayout 中,center_vertical 作为其重力,那么LinearLayout 具有layout_constraintTop_toBottomOf="@+id/waste_type_close。这就是我想要实现的目标,但没有LinearLayout。我也应该把这个放在问题中
【解决方案2】:

我认为仅使用带有三个孩子的 ConstraintLayout 是不可能实现这种布局的。

尽管 ConstraintLayout 的“重点”是避免嵌套视图,但有时这是获得所需内容的唯一方法。在这里,我认为您应该将waste_type_imagewaste_type_name 包装在LinearLayout 中。

<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/layout_root"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingTop="20dp"
    android:paddingLeft="16dp"
    android:paddingRight="16dp">

    <ImageView
        android:id="@+id/waste_type_close"
        android:layout_width="24dp"
        android:layout_height="24dp"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:srcCompat="@drawable/ic_delete_24dp"/>

    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:gravity="center_vertical"
        android:orientation="horizontal"
        app:layout_constraintTop_toBottomOf="@+id/waste_type_close"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent">

        <ImageView
            android:id="@+id/waste_type_image"
            android:layout_width="84dp"
            android:layout_height="84dp"
            android:layout_marginLeft="20dp"
            app:srcCompat="@drawable/ic_share_24dp"/>

        <TextView
            android:id="@+id/waste_type_name"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:layout_marginLeft="12dp"
            android:textSize="30sp"
            android:textStyle="bold"
            android:text="name"/>

    </LinearLayout>

</android.support.constraint.ConstraintLayout

【讨论】:

  • “有时这是获得你想要的东西的唯一方法”.. 这太可悲了.. Alexa 玩 Despacito :(.. 在我问这个问题之前,我也一直在使用这种布局,并摆弄有了它..好吧,直到找到答案,我现在应该继续使用它..
  • 问题是你的两个视图需要两个“顶部”约束:你需要 waste_type_imagewaste_type_name 的顶部/底部来约束彼此的顶部/底部(所以你得到垂直居中),但你还需要两者的顶部约束到 waste_type_close 的底部(这样你就可以将它们放在关闭的图像下方)......而 ConstraintLayout 就是不能这样做。
  • 是的,这就是问题所在,如果只有group 可以做这种事情.. 它只知道如何设置其视图的可见性
【解决方案3】:

您可以使用SequenceLayout 来实现此目的。

那里已经有一个类似问题的示例。 (查看Use Android's ConstraintLayout to create table-like view

以下是你如何做到这一点:

<com.yashoid.sequencelayout.SequenceLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/layout_root"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:pgSize="360"
    app:sequences="@xml/sequences">

    <ImageView
        android:id="@+id/waste_type_close"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:src="@drawable/ic_account_alert_grey600_24dp"/>

    <View
        android:id="@+id/helper"
        android:layout_width="0dp"
        android:layout_height="0dp"/>

    <ImageView
        android:id="@+id/waste_type_image"
        android:layout_width="84dp"
        android:layout_height="84dp"
        android:src="@drawable/ic_account_alert_black_48dp"/>

    <TextView
        android:id="@+id/waste_type_name"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="name"
        android:textSize="30sp"
        android:textStyle="bold"/>

</com.yashoid.sequencelayout.SequenceLayout>

您的@xml/sequences 将是这样的:

<Sequences>
    <Horizontal>
        <Span size="1w"/>
        <Span id="@id/waste_type_close" size="24pg"/>
        <Span size="16pg"/>
    </Horizontal>

    <Horizontal>
        <Span size="36pg"/>
        <Span id="@id/waste_type_image" size="84pg"/>
        <Span size="12pg"/>
        <Span id="@id/waste_type_name" size="1w"/>
        <Span size="16pg"/>
    </Horizontal>

    <Vertical>
        <Span size="20pg"/>
        <Span id="@id/waste_type_close" size="24pg"/>
        <Span size="16pg"/>
        <Span id="@id/helper" size="@MAX(100%waste_type_image,100%waste_type_name)"/>
    </Vertical>

    <Vertical start="start@helper" end="end@helper">
        <Span size="1w"/>
        <Span id="waste_type_image" size="84pg"/>
        <Span size="1w"/>
    </Vertical>

    <Vertical id="waste_type_name_sequence" start="start@helper" end="end@helper">
        <Span size="1w"/>
        <Span id="waste_type_name" size="wrap"/>
        <Span size="1w"/>
    </Vertical>
</Sequences>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-25
    • 2021-07-26
    • 1970-01-01
    • 2021-06-28
    • 1970-01-01
    • 2020-06-12
    • 2019-08-19
    • 1970-01-01
    相关资源
    最近更新 更多