在ConstraintLayout中定位导致Horizo​​ntalScrollView截断内容

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" 将 ScrollHorizo​​ntalView 包裹的 TextView 定位在 ImageView 的右侧。但它也引起了异常行为。存储在 TextView 中的文本可以滚动,但会被几个字母截断。当我删除此行 app:layout_constraintLeft_toRightOf="@id/object_type_icon_image_view" 时,文本会在滚动时完全显示。有什么办法可以解决这个问题吗?

屏幕:

android:text="123456789123456789123456789123456789123456789123456789"
  1. 位于ImageView右侧时滚动前

  2. 定位到 ImageView 右侧时滚动后 - 它被截断

  3. 滚动前没有定位

  4. 滚动后没有定位 - 没问题

<?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.

调整自身大小