约束布局链
Constraint layout chains
发现了一个我发现很难使用 ConstraintLayout
让我解释一下我在附图中发现的问题
这里有两行。绿色框代表文本视图。橙色框代表 ImageView(或任何其他一般视图)。
在第一行,Textview1(左)被限制在屏幕的左侧。图像视图受限于此文本视图。
我遇到的问题是此文本视图大于右侧的文本视图。我不想用图像来覆盖那个视图。我希望它最终像该图像中的第二行一样。
我想我应该使用约束链。但我无法让它发挥作用。
关于如何实现我想要的有什么想法吗?
编辑,添加布局
<?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">
<TextView
android:id="@+id/tv1"
android:layout_width="wrap_content"
android:layout_height="19dp"
android:layout_marginEnd="8dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:ellipsize="end"
android:lines="1"
app:layout_constraintEnd_toStartOf="@+id/tv2"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="@string/lorem_ipsum" />
<ImageView
android:id="@+id/iv1"
android:layout_width="16dp"
android:layout_height="16dp"
android:layout_marginEnd="8dp"
android:layout_marginStart="8dp"
app:layout_constraintBottom_toBottomOf="@+id/tv1"
app:layout_constraintEnd_toStartOf="@+id/tv2"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toEndOf="@+id/tv1"
app:layout_constraintTop_toTopOf="@+id/tv1"
tools:background="@drawable/ic_close" />
<TextView
android:id="@+id/tv2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:layout_marginTop="8dp"
android:textAlignment="viewEnd"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="18 000 000 Dollar" />¨
</android.support.constraint.ConstraintLayout>
ConstrataintLayout
版本 1.1.0-beta5 提供了一些您正在寻找的更好的维度控制。见 release notes.
具体来说,您可以使用 layout_constraintWidth_default = wrap
,这将强制 TextView
在满足其约束限制后换行。
Wrap provides a significant new behaviour, with the widget resizing as if wrap_content was used, but limited by the connected constraints. A widget will thus not grow beyond the endpoints.
下面的 XML 将 tv1
和 iv1
放在由左侧父项和右侧 tv2
约束的打包链中。 tv1
已设置 app:layout_constraintWidth_default="wrap"
。
<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tv1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:layout_marginStart="8dp"
android:ellipsize="end"
android:lines="1"
android:text="This is some very long text. How does it behave?"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/iv1"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintHorizontal_chainStyle="packed"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintWidth_default="wrap"
tools:ignore="HardcodedText" />
<ImageView
android:id="@+id/iv1"
android:layout_width="16dp"
android:layout_height="16dp"
android:layout_marginEnd="8dp"
android:background="#ff9d00"
app:layout_constraintBottom_toBottomOf="@+id/tv1"
app:layout_constraintEnd_toStartOf="@id/tv2"
app:layout_constraintStart_toEndOf="@+id/tv1"
app:layout_constraintTop_toTopOf="@+id/tv1"
tools:ignore="ContentDescription" />
<TextView
android:id="@+id/tv2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:text="18 000 000 Dollar"
android:textAlignment="viewEnd"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="HardcodedText" />
<android.support.v4.widget.Space
android:id="@+id/spacer"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="@id/tv2"
app:layout_constraintEnd_toStartOf="@id/tv2"
app:layout_constraintTop_toTopOf="@id/tv2" />
</android.support.constraint.ConstraintLayout>
这是长文本布局的外观...
...和一些短文本...
您可以像 html
中的 z-index 那样使用 elevation
属性。
像这样为 ImageView 添加 elevation=1dp 为 TextView 添加 elevation=2dp
<ImageView
android:id="@+id/iv1"
android:elevation="1dp"
android:layout_width="16dp"
android:layout_height="16dp"
android:layout_marginEnd="8dp"
android:layout_marginStart="8dp"
app:layout_constraintBottom_toBottomOf="@+id/tv1"
app:layout_constraintEnd_toStartOf="@+id/tv2"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toEndOf="@+id/tv1"
app:layout_constraintTop_toTopOf="@+id/tv1"
tools:background="@drawable/ic_close" />
<TextView
android:id="@+id/tv2"
android:elevation="2dp"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:layout_marginTop="8dp"
android:textAlignment="viewEnd"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="18 000 000 Dollar" />¨
发现了一个我发现很难使用 ConstraintLayout
让我解释一下我在附图中发现的问题
这里有两行。绿色框代表文本视图。橙色框代表 ImageView(或任何其他一般视图)。
在第一行,Textview1(左)被限制在屏幕的左侧。图像视图受限于此文本视图。
我遇到的问题是此文本视图大于右侧的文本视图。我不想用图像来覆盖那个视图。我希望它最终像该图像中的第二行一样。
我想我应该使用约束链。但我无法让它发挥作用。
关于如何实现我想要的有什么想法吗?
编辑,添加布局
<?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">
<TextView
android:id="@+id/tv1"
android:layout_width="wrap_content"
android:layout_height="19dp"
android:layout_marginEnd="8dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:ellipsize="end"
android:lines="1"
app:layout_constraintEnd_toStartOf="@+id/tv2"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="@string/lorem_ipsum" />
<ImageView
android:id="@+id/iv1"
android:layout_width="16dp"
android:layout_height="16dp"
android:layout_marginEnd="8dp"
android:layout_marginStart="8dp"
app:layout_constraintBottom_toBottomOf="@+id/tv1"
app:layout_constraintEnd_toStartOf="@+id/tv2"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toEndOf="@+id/tv1"
app:layout_constraintTop_toTopOf="@+id/tv1"
tools:background="@drawable/ic_close" />
<TextView
android:id="@+id/tv2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:layout_marginTop="8dp"
android:textAlignment="viewEnd"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="18 000 000 Dollar" />¨
</android.support.constraint.ConstraintLayout>
ConstrataintLayout
版本 1.1.0-beta5 提供了一些您正在寻找的更好的维度控制。见 release notes.
具体来说,您可以使用 layout_constraintWidth_default = wrap
,这将强制 TextView
在满足其约束限制后换行。
Wrap provides a significant new behaviour, with the widget resizing as if wrap_content was used, but limited by the connected constraints. A widget will thus not grow beyond the endpoints.
下面的 XML 将 tv1
和 iv1
放在由左侧父项和右侧 tv2
约束的打包链中。 tv1
已设置 app:layout_constraintWidth_default="wrap"
。
<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tv1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:layout_marginStart="8dp"
android:ellipsize="end"
android:lines="1"
android:text="This is some very long text. How does it behave?"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/iv1"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintHorizontal_chainStyle="packed"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintWidth_default="wrap"
tools:ignore="HardcodedText" />
<ImageView
android:id="@+id/iv1"
android:layout_width="16dp"
android:layout_height="16dp"
android:layout_marginEnd="8dp"
android:background="#ff9d00"
app:layout_constraintBottom_toBottomOf="@+id/tv1"
app:layout_constraintEnd_toStartOf="@id/tv2"
app:layout_constraintStart_toEndOf="@+id/tv1"
app:layout_constraintTop_toTopOf="@+id/tv1"
tools:ignore="ContentDescription" />
<TextView
android:id="@+id/tv2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:text="18 000 000 Dollar"
android:textAlignment="viewEnd"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="HardcodedText" />
<android.support.v4.widget.Space
android:id="@+id/spacer"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="@id/tv2"
app:layout_constraintEnd_toStartOf="@id/tv2"
app:layout_constraintTop_toTopOf="@id/tv2" />
</android.support.constraint.ConstraintLayout>
这是长文本布局的外观...
...和一些短文本...
您可以像 html
中的 z-index 那样使用 elevation
属性。
像这样为 ImageView 添加 elevation=1dp 为 TextView 添加 elevation=2dp
<ImageView
android:id="@+id/iv1"
android:elevation="1dp"
android:layout_width="16dp"
android:layout_height="16dp"
android:layout_marginEnd="8dp"
android:layout_marginStart="8dp"
app:layout_constraintBottom_toBottomOf="@+id/tv1"
app:layout_constraintEnd_toStartOf="@+id/tv2"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toEndOf="@+id/tv1"
app:layout_constraintTop_toTopOf="@+id/tv1"
tools:background="@drawable/ic_close" />
<TextView
android:id="@+id/tv2"
android:elevation="2dp"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:layout_marginTop="8dp"
android:textAlignment="viewEnd"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="18 000 000 Dollar" />¨