问题
I have noticed weird behavior of ConstraintLayout
(version 1.1.3) that hides the last line of TextView
whenever I try to use height with wrap_content
property and layout_constrainedHeight
is set to true
.
With layout_constrainedHeight
:
With no layout_constrainedHeight
:
Source code:
<?xml version="1.0" encoding="utf-8"?>
<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:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="16dp"
android:text="Lorem..."
app:layout_constrainedHeight="true"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
I thought that whenever I want to use wrap_content
with ConstraintLayout
I have to set layout_constrainedHeight
to true, but this sometimes gives me weird bugs. Am I missing something?
EDIT
If I remove the margin around TextView
, it works fine. It seems that ConstraintLayout
does something wrong with wrap_content
and margins.
回答1:
Try adding one more constraint for bottom of your TextView
- app:layout_constraintBottom_toBottomOf="parent"
or app:layout_constraintBottom_toTopOf="@id/someOtherView"
and this someOtherView
should have bottom constraint to the parent. There should be a vertical chain in order app:layout_constrainedHeight
to work.
Hope it helps.
回答2:
According to documentation:
WRAP_CONTENT : enforcing constraints (Added in 1.1)
If a dimension is set to WRAP_CONTENT, in versions before 1.1 they will be treated as a literal dimension -- meaning, constraints will not limit the resulting dimension. While in general this is enough (and faster), in some situations, you might want to use WRAP_CONTENT, yet keep enforcing constraints to limit the resulting dimension. In that case, you can add one of the corresponding attribute:
app:layout_constrainedWidth=”true|false”
app:layout_constrainedHeight=”true|false”
I'll emphasise a piece of this quote: keep enforcing constraints to limit the resulting dimension
So basically, setting layout_constrainedHeight
or layout_constrainedWidth
to true
will preserve constraints and reduce view size by the specified margin instead of pushing all the other views around and increasing current view height/width to fit the content.
Here is an example with app:layout_constrainedHeight="true"
and app:layout_constrainedWidth=”true”
and different margins. Red TextView
wrapped it's content and after that was reduced in size. Green TextView
has no app:layout_constrained...="true"
attributes and margins set. Their height is equal, but the width is different in the end.
The layout:
<?xml version="1.0" encoding="utf-8"?>
<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/top_text_view"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="86dp"
android:layout_marginEnd="26dp"
android:background="#ff2356"
android:text="@string/lorem_kind_of"
android:textColor="@android:color/white"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constrainedHeight="true"/> <!-- This line is the only difference -->
<TextView
android:id="@+id/bottom_text_view"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="86dp"
android:layout_marginEnd="26dp"
android:background="#009900"
android:text="@string/lorem_kind_of"
android:textColor="@android:color/white"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/top_text_view" />
</androidx.constraintlayout.widget.ConstraintLayout>
My guess is that you probably do not need to use app:layout_constrainedHeight
attribute. You are welcome to leave a comment and we will elaborate on this further if my answer doesn't solve your problem.
UPDATE (22 May 2020)
Looks like the behaviour that you want is achievable only without the app:layout_constrainedHeight="true"
. I may be wrong, it depends on the final desired result, but according to my "experiments" looks like app:layout_constrainedHeight
constraints a view from growing further it's minimum size.
I've updated the XML code and recorded a little video to see the difference.
来源:https://stackoverflow.com/questions/61823981/constraintlayout-hides-the-last-line-of-textview-with-applayout-constrainedheig