TextView: 如何实现多行自适应文本框?

4

我有以下的TextView:

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:minLines="2"
    android:text="Lorem ipsum dolor sit amet"/>


这是我得到的效果:

这是我期望的效果:

我想要达到这种效果,但不想设置硬编码宽度,因为每种语言的文本都不同。有没有什么方法可以实现?
编辑:我也想避免将TextView的宽度绑定到父容器的宽度。即使有足够的空间在单行中显示整个文本,我也希望其以两行显示。因此,我希望TextView具有最小可能的宽度。

1
只需添加您的TextView的起始和结束约束即可。 - elbert rivas
1个回答

1

是的,您可以使用ConstraintLayoutGuidelines来确定您的textView宽度(不是硬编码的),这里有一个简单的示例不使用guidlines(文本视图上有约束):

<?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:id="@+id/mainQuestionsLayout"
  android:layout_width="match_parent"
  android:layout_height="match_parent">


<TextView
    android:id="@+id/textView11"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_marginStart="8dp"
    android:layout_marginTop="8dp"
    android:layout_marginEnd="8dp"
    android:layout_marginBottom="8dp"
    android:text="TextVieasdasdwTextVieasdasdwTextVieasdasdwTextVieasdasdwTextVieasdasdwTextVieasdasdwTextVieasdasdwTextVieasdasdwTextVieasdasdwTextVieasdasdw"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>

它看起来会像这样:

它将会是这个样子:

enter image description here

现在,如果你想要更灵活的宽度,你可以使用指南或者将你的文本视图约束到另一个视图并将其宽度设置为0dp
下面是一个使用指南的例子:
<?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:id="@+id/mainQuestionsLayout"
  android:layout_width="match_parent"
  android:layout_height="match_parent">


<TextView
    android:id="@+id/textView11"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_marginStart="8dp"
    android:layout_marginTop="8dp"
    android:layout_marginEnd="8dp"
    android:layout_marginBottom="8dp"
    android:text="TextVieasdasdwTextVieasdasdwTextVieasdasdwTextVieasdasdwTextVieasdasdwTextVieasdasdwTextVieasdasdwTextVieasdasdwTextVieasdasdwTextVieasdasdw"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toStartOf="@+id/guideline19"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

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

这将会是这个样子:

而且它看起来像这样:

enter image description here

请注意,虚线是实际的指导线,在设计预览中看起来就像这样,但在运行时您将看不到指导线,但您的textView将会呈现出这种效果。

谢谢您的回答!但我也不想将TextView的宽度绑定到父容器的宽度。我想要的是,只要文本显示在两行中(如果没有足够的空间,可以接受文本显示在两行以上),TextView就具有最小可能的宽度。我表达得不太清楚,对此感到抱歉。 - Milack27
你不必将TextView的宽度绑定到父容器的宽度上,可以查看回答中关于指南线部分的内容。如果你想让你的textView显示两行文本,那就需要在代码中进行设置。我建议你这样做。 - Tamir Abutbul
我理解,但每个指南都是根据与父级边框的距离(绝对或百分比)来定义的。因此,当您将TextView的宽度绑定到指南时,实际上是将其间接绑定到父级的宽度。 - Milack27
在这种情况下,我认为你没有其他选择,除了将视图大小固定。或者 - 你可以获取textView的文本,将其分成两半,在中间加上\n。结果将是一个两行的textView。 - Tamir Abutbul
解决方案正是我最终所做的。:D - Milack27
如果我的回答有帮助,请接受它,这样它就能帮助将来遇到相同问题的其他开发者。很高兴能有所帮助。 - Tamir Abutbul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接