Android 如何在保持最大长度的同时使两个文本视图包装内容?

Android 如何在保持最大长度的同时使两个文本视图包装内容?,android,android-layout,android-constraintlayout,Android,Android Layout,Android Constraintlayout,我正在开发一个聊天功能,我希望用户的信息显示在右侧,其他人的信息显示在左侧。右翼正在制造一些麻烦 由于消息很短,它应该贴在屏幕的右侧,然后用户的名字应该就在它旁边,如下所示(Android开发者的“显示布局边界”处于启用状态): 只需一些简单的线性布局,两个文本视图向右对齐,但您可以看到这对较长的消息不起作用,因为它们被剪掉了,而且名称通常根本看不见。我通过约束布局成功地做到了这一点: ] ConstraintLayout(包装器)左侧的边距有一个100dp约束,在该约束中,名称和消息被链接起

我正在开发一个聊天功能,我希望用户的信息显示在右侧,其他人的信息显示在左侧。右翼正在制造一些麻烦

由于消息很短,它应该贴在屏幕的右侧,然后用户的名字应该就在它旁边,如下所示(Android开发者的“显示布局边界”处于启用状态):

只需一些简单的
线性布局
,两个
文本视图
向右对齐,但您可以看到这对较长的消息不起作用,因为它们被剪掉了,而且名称通常根本看不见。我通过约束布局成功地做到了这一点:

]

ConstraintLayout
(包装器)左侧的边距有一个100dp约束,在该约束中,名称和消息被链接起来。缺点是短消息不再是正确的

我如何管理布局以自动对齐我想要的方式


您应该能够通过实施
约束
指南
来管理此功能

通过这种方式,您可以垂直分割整个布局,分离用户消息和响应,同时分别格式化每一面

<android.support.constraint.Guideline
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/guideline"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.5" />

尝试使用类似以下内容:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout android:layout_height="match_parent"
android:layout_width="match_parent"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">

<android.support.constraint.Guideline
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/guideline"
    android:orientation="vertical"
    app:layout_constraintGuide_percent="0.5" />

<LinearLayout
    app:layout_constraintRight_toLeftOf="@id/guideline"
    android:id="@+id/friend_column"
    android:layout_width="0dp"
    app:layout_constraintWidth_percent=".5"
    android:layout_marginLeft="10dp"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <TextView
        android:id="@+id/friend"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textStyle="bold"
        android:text="Friend"/>
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginRight="10dp"
        android:gravity="end"
        android:text="Whats up?"/>
</LinearLayout>

<LinearLayout
    app:layout_constraintTop_toBottomOf="@id/friend_column"
    app:layout_constraintLeft_toRightOf="@id/guideline"
    android:id="@+id/user_column"
    android:layout_width="0dp"
    app:layout_constraintWidth_percent=".5"
    android:layout_marginRight="10dp"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <TextView
        android:id="@+id/user"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="end"
        android:textStyle="bold"
        android:text="User"/>
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginRight="10dp"
        android:gravity="end"
        android:text="I'm sailing away set an open course for the virgin sea
        I've got to be free free to face the life that's ahead of me
        On board I'm the captain so climb aboard
        We'll search for tomorrow on every shore
        And I'll try oh Lord I'll try to carry on"/>
</LinearLayout>

</android.support.constraint.ConstraintLayout>

如果您已经有了一个
ConstraintLayout
,那么这可能会帮助您对可能的约束属性进行更多的处理

<?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"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp">

  <TextView
      android:id="@+id/name"
      style="@style/TextAppearance.AppCompat.Body1"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_marginStart="100dp"
      android:paddingEnd="8dp"
      android:text="Name"
      app:layout_constraintEnd_toStartOf="@id/message"
      app:layout_constraintHorizontal_chainStyle="spread_inside"
      app:layout_constraintStart_toStartOf="parent"/>

  <TextView
      android:id="@+id/message"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_marginEnd="16dp"
      android:text="Message"
      app:layout_constrainedWidth="true"
      app:layout_constraintEnd_toEndOf="parent"
      app:layout_constraintStart_toEndOf="@id/name"/>

  <TextView
      android:id="@+id/name2"
      style="@style/TextAppearance.AppCompat.Body1"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_marginStart="100dp"
      android:paddingEnd="8dp"
      android:text="Name"
      app:layout_constraintEnd_toStartOf="@id/message2"
      app:layout_constraintHorizontal_chainStyle="spread_inside"
      app:layout_constraintStart_toStartOf="parent"
      app:layout_constraintTop_toBottomOf="@id/message"/>

  <TextView
      android:id="@+id/message2"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_marginEnd="16dp"
      android:text="A Very Long message for you to read  set we cen test to row breaking in this text Message"
      app:layout_constrainedWidth="true"
      app:layout_constraintEnd_toEndOf="parent"
      app:layout_constraintStart_toEndOf="@id/name2"
      app:layout_constraintTop_toBottomOf="@id/message"/>
</android.support.constraint.ConstraintLayout>

)

另外
app:layout\u constraintHorizontal\u chainStyle=“spread\u inside”
注意,视图始终对齐到最大的左侧和右侧,这是约束布局中的链接()


希望它能帮助您解决问题。

将您的版面代码放在屏幕右侧,因为我们可以帮助您……您应该使用相对版面,或者使用FrameLayout并将重力设置为right,然后如何确保短消息贴在屏幕右侧?@AxelKöhler也许我更新的答案可以给您一个想法。包括您的布局文件也可以帮助用户提供更好的答案。我知道您要去哪里,但在这种情况下,自己的消息(或者更确切地说,包装它们的线性布局)应该受到正确的约束(因此不需要指南),这是我已经尝试过的“解决方案”。唯一的区别是你使用的属性是我的Android Studio拒绝编译的
应用程序:layout\u constraintWidth\u percent
(它只知道
\u default
\u max
\u min
)。有什么解决方案吗?确保您正在实现最新的约束布局
implementation'com.android.support.constraint:constraint layout:1.1.0'
Hmm,这看起来确实不错。您能告诉我如何将用户的姓名粘贴到邮件上吗?底部消息的行为与我希望的一样,但对于第一个消息,用户名和我希望避免的消息之间存在差距(应该与我的第一张图片中的情况相同)。使用“app:layout\u constraintHorizontal\u chainStyle=“packed”而不是在内部传播。并为链添加1的水平偏差。