在ConstraintLayout中定位导致HorizontalScrollView截断内容
Positioning in ConstraintLayout causes HorizontalScrollView to cut off content
<android.support.constraint.ConstraintLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="14"
android:layout_gravity="bottom"
android:background="@drawable/object_detailed_information_bar"
android:padding="@dimen/object_detailed_information_bar_padding">
<ImageView
android:layout_width="wrap_content"
android:layout_height="0dp"
android:id="@+id/object_type_icon_image_view"
android:scaleType="fitXY"
android:adjustViewBounds="true"
android:src="@drawable/restaurant_marker_icon"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"/>
<HorizontalScrollView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/object_name_text_view_margin_start_or_left"
android:layout_marginStart="@dimen/object_name_text_view_margin_start_or_left"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toRightOf="@id/object_type_icon_image_view">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/object_name_text_view"
android:scrollHorizontally="true"
android:lines="1" />
</HorizontalScrollView>
</android.support.constraint.ConstraintLayout>
我使用 app:layout_constraintLeft_toRightOf="@id/object_type_icon_image_view"
将 ScrollHorizontalView 包裹的 TextView 定位在 ImageView 的右侧。但它也引起了异常行为。存储在 TextView 中的文本可以滚动,但会被几个字母截断。当我删除此行 app:layout_constraintLeft_toRightOf="@id/object_type_icon_image_view"
时,文本会在滚动时完全显示。有什么办法可以解决这个问题吗?
屏幕:
android:text="123456789123456789123456789123456789123456789123456789"
位于ImageView右侧时滚动前
定位到 ImageView 右侧时滚动后 - 它被截断
滚动前没有定位
滚动后没有定位 - 没问题
<?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">
<ImageView
android:id="@+id/object_type_icon_image_view"
android:layout_width="200dp"
android:layout_height="0dp"
android:src="@color/link_blue"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<HorizontalScrollView
android:id="@+id/horizontalScrollView"
android:layout_width="0dp"
android:layout_height="0dp"
android:background="@color/red"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/object_type_icon_image_view"
app:layout_constraintTop_toTopOf="parent">
<TextView
android:id="@+id/object_name_text_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="Horizontal Scroll View"
android:textSize="25sp"
android:gravity="center"
tools:layout_editor_absoluteX="16dp"
tools:layout_editor_absoluteY="16dp" />
</HorizontalScrollView>
</android.support.constraint.ConstraintLayout>
你需要这个吗?
简答:
将 HorizontalScrollView
的宽度更改为 0dp 并将其右边缘限制为父级:
android:layout_width="0dp"
app:layout_constraintRight_toRightOf="parent"
解释:
现在,您的 HorizontalScrollView
正在使用 wrap_content
作为宽度。这使得它尝试与文本一样长,但父项(ConstraintLayout
)不允许其子项的宽度大于其自身。所以你的 HorizontalScrollView
最终与 ConstraintLayout
.
的宽度相同
但是,您 定位 HorizontalScrollView
使其稍微向右移动。这意味着视图的一部分是不可见的; ConstraintLayout
正在剪切 HorizontalScrollView
。
要解决此问题,您需要确保 HorizontalScrollView
与图像右边缘和父级右边缘之间的 space 一样宽。您已经在 HorizontalScrollView
上有一个左约束,因此您需要添加一个右约束。一旦两边都被约束,就可以用0dp的宽度来表示"match constraints";现在 HorizontalScrollView
将根据可用的 space.
调整自身大小
<android.support.constraint.ConstraintLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="14"
android:layout_gravity="bottom"
android:background="@drawable/object_detailed_information_bar"
android:padding="@dimen/object_detailed_information_bar_padding">
<ImageView
android:layout_width="wrap_content"
android:layout_height="0dp"
android:id="@+id/object_type_icon_image_view"
android:scaleType="fitXY"
android:adjustViewBounds="true"
android:src="@drawable/restaurant_marker_icon"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"/>
<HorizontalScrollView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/object_name_text_view_margin_start_or_left"
android:layout_marginStart="@dimen/object_name_text_view_margin_start_or_left"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toRightOf="@id/object_type_icon_image_view">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/object_name_text_view"
android:scrollHorizontally="true"
android:lines="1" />
</HorizontalScrollView>
</android.support.constraint.ConstraintLayout>
我使用 app:layout_constraintLeft_toRightOf="@id/object_type_icon_image_view"
将 ScrollHorizontalView 包裹的 TextView 定位在 ImageView 的右侧。但它也引起了异常行为。存储在 TextView 中的文本可以滚动,但会被几个字母截断。当我删除此行 app:layout_constraintLeft_toRightOf="@id/object_type_icon_image_view"
时,文本会在滚动时完全显示。有什么办法可以解决这个问题吗?
屏幕:
android:text="123456789123456789123456789123456789123456789123456789"
位于ImageView右侧时滚动前
定位到 ImageView 右侧时滚动后 - 它被截断
滚动前没有定位
滚动后没有定位 - 没问题
<?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">
<ImageView
android:id="@+id/object_type_icon_image_view"
android:layout_width="200dp"
android:layout_height="0dp"
android:src="@color/link_blue"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<HorizontalScrollView
android:id="@+id/horizontalScrollView"
android:layout_width="0dp"
android:layout_height="0dp"
android:background="@color/red"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/object_type_icon_image_view"
app:layout_constraintTop_toTopOf="parent">
<TextView
android:id="@+id/object_name_text_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="Horizontal Scroll View"
android:textSize="25sp"
android:gravity="center"
tools:layout_editor_absoluteX="16dp"
tools:layout_editor_absoluteY="16dp" />
</HorizontalScrollView>
</android.support.constraint.ConstraintLayout>
你需要这个吗?
简答:
将 HorizontalScrollView
的宽度更改为 0dp 并将其右边缘限制为父级:
android:layout_width="0dp"
app:layout_constraintRight_toRightOf="parent"
解释:
现在,您的 HorizontalScrollView
正在使用 wrap_content
作为宽度。这使得它尝试与文本一样长,但父项(ConstraintLayout
)不允许其子项的宽度大于其自身。所以你的 HorizontalScrollView
最终与 ConstraintLayout
.
但是,您 定位 HorizontalScrollView
使其稍微向右移动。这意味着视图的一部分是不可见的; ConstraintLayout
正在剪切 HorizontalScrollView
。
要解决此问题,您需要确保 HorizontalScrollView
与图像右边缘和父级右边缘之间的 space 一样宽。您已经在 HorizontalScrollView
上有一个左约束,因此您需要添加一个右约束。一旦两边都被约束,就可以用0dp的宽度来表示"match constraints";现在 HorizontalScrollView
将根据可用的 space.