Android 如何防止ConstraintLayout链中的TextView在使用layout_constrainedWidth时将其他TextView推到其约束之外?
我的最终目标是在一个左对齐、压缩的水平链中有两个单行文本视图,这两个文本视图都可以增长以填充剩余的空间,必要时可以将其均匀分割,并在没有空间时进行椭圆化 视觉辅助: 下面是我试图实现的布局代码:Android 如何防止ConstraintLayout链中的TextView在使用layout_constrainedWidth时将其他TextView推到其约束之外?,android,android-layout,android-support-library,android-constraintlayout,Android,Android Layout,Android Support Library,Android Constraintlayout,我的最终目标是在一个左对齐、压缩的水平链中有两个单行文本视图,这两个文本视图都可以增长以填充剩余的空间,必要时可以将其均匀分割,并在没有空间时进行椭圆化 视觉辅助: 下面是我试图实现的布局代码: <?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/and
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="16dp">
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:maxLines="1"
tools:text="@tools:sample/lorem"
app:layout_constrainedWidth="true"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toStartOf="@id/textView2"
app:layout_constraintHorizontal_chainStyle="packed"
app:layout_constraintHorizontal_bias="0"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="4dp"
android:ellipsize="end"
android:maxLines="1"
tools:text="@tools:sample/lorem"
app:layout_constrainedWidth="true"
app:layout_constraintStart_toEndOf="@id/textView1"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent" />
</android.support.constraint.ConstraintLayout>
我曾尝试在每个视图上使用类似于将layout\u constraint或horizontal\u weight
设置为.5的方法,但这没有效果,除非我将两个视图的宽度都更改为0dp(match\u constraints),这打破了两个视图都有短文本的情况(在两个文本视图之间增加了额外的空间)
它的感觉是,当您将width=wrap\u content
与layout\u constrained width=true
组合时,权重值被忽略。这仅仅是一种限制吗?我花了很多时间试图找出一种方法来实现这一点,但现在看来这似乎不可能。我已经退回到使用线性布局,并做出一些设计妥协,但如果有人有任何想法,我真的很想让它工作。谢谢 如果有人仍在寻找答案,我认为下面的代码会有所帮助
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto">
<TextView
android:id="@+id/text1"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintWidth_max="wrap"
app:layout_constraintWidth_percent="0.5"
android:maxLines="1"
android:ellipsize="end"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toStartOf="@id/text2"
app:layout_constraintHorizontal_chainStyle="packed"
android:background="#ff0000"
android:text="This is what you are looking for ?"
/>
<TextView
android:id="@+id/text2"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintWidth_max="wrap"
app:layout_constraintWidth_percent="1"
android:maxLines="1"
android:ellipsize="end"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toEndOf="@id/text1"
app:layout_constraintEnd_toEndOf="parent"
android:background="#ee0"
android:text="This is a Long Text TextView2 And not something else"
/>
</android.support.constraint.ConstraintLayout>
在ConstaninLayout中,如果要设置权重,如linearLayout的权重,则应将值设置在0..1英寸(布局约束宽度百分比)之间:
并将构件的起点和终点相互连接:
app:layout_constraintStart_toEndOf="@id/textView1"
app:layout_constraintEnd_toStartOf="@id/textView2"
完成代码:
<androidx.constraintlayout.widget.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">
<TextView
android:id="@+id/textView1"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toStartOf="@id/textView2"
app:layout_constraintWidth_percent="0.5"
android:background="@color/yellow_light"
android:text="This is a long text that showing in textview1.This textview is a expanded textview.if you don't set (android:maxLines='1'),the whole text will be show." />
<TextView
android:id="@+id/textView2"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/textView1"
app:layout_constraintWidth_percent="1"
android:background="@color/orange_dark"
android:maxLines="1"
android:text="This is a long text that showing in textview2 that set (android:maxLines='1')" />
</androidx.constraintlayout.widget.ConstraintLayout>
我需要修复另一个答案
并执行以下操作
您是否尝试过在左视图上设置app:layout\u constraintWidth\u min=“someVal”
以防止其缩小到0?我没有尝试过。听起来它可以帮助视图完全消失,但它仍然不能完全满足我的需要,因为我使用的字符串可能比我的最小值短,这将导致空空间,从技术上讲,我同意在第一个视图中,空字符串的最小宽度为0。感谢您的建议,我可能可以同时处理这个问题。您接受代码中的解决方案吗?@deadfish这取决于……如果只是在代码中初始化xml中无法完成的事情,那么是的,但是测量文本并相应地调整布局的东西会破坏这个问题的目的,因为我特别尝试使用ConstraintLayout属性“自然”地使其工作,在这一点上,我可以创建一个自定义视图或真正使用任何类型的视图
<androidx.constraintlayout.widget.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">
<TextView
android:id="@+id/textView1"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toStartOf="@id/textView2"
app:layout_constraintWidth_percent="0.5"
android:background="@color/yellow_light"
android:text="This is a long text that showing in textview1.This textview is a expanded textview.if you don't set (android:maxLines='1'),the whole text will be show." />
<TextView
android:id="@+id/textView2"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/textView1"
app:layout_constraintWidth_percent="1"
android:background="@color/orange_dark"
android:maxLines="1"
android:text="This is a long text that showing in textview2 that set (android:maxLines='1')" />
</androidx.constraintlayout.widget.ConstraintLayout>
<TextView
android:id="@+id/first_tv"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:ellipsize="end"
android:maxLines="1"
app:layout_constraintHorizontal_bias="0" <!-- if you want gravity left -->
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/second_tv"
app:layout_constraintHorizontal_chainStyle="packed"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintWidth_default="wrap"
tools:text="ABCDEFGHIJKLMNOPQRSTU" />
<TextView
android:id="@+id/second_tv"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="2dp"
android:ellipsize="end"
android:maxLines="1"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/first_tv"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintWidth_default="wrap"
tools:text="VWXYZ" />