Android中的多行文本视图?

175

我在 xml 中使用了以下代码:

<TableRow>
    <TextView android:id="@+id/address1"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content"
        android:gravity="left"
        android:maxLines="4" 
        android:singleLine="false"              
        android:text="Johar Mor, Gulistan-e-Johar, Karachi" >
    </TextView> 
</TableRow>

对于使用 TableLayout,它无法处理多行文本,因此它不起作用。

那么我在这里犯了什么错误?

21个回答

213
如果您要放入TextView的文本很短,它将不会自动扩展为四行。如果您希望TextView始终具有四行,而不管其中的文本长度如何,请设置android:lines属性:
<TextView
    android:id="@+id/address1"
    android:gravity="left"
    android:layout_height="fill_parent"
    android:layout_width="wrap_content"
    android:maxLines="4"
    android:lines="4"
    android:text="Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat."></TextView>

你可以使用TableRow来实现这一点,以下是示例代码

<TableRow >
        <TextView
            android:id="@+id/tv_description_heading"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="left"
            android:padding="8dp"
            android:text="@string/rating_review"
            android:textColor="@color/black"
            android:textStyle="bold" />

        <TextView
            android:id="@+id/tv_description"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="left"
            android:maxLines="4"`enter code here`
            android:padding="8dp"
            android:text="The food test was very good."
            android:textColor="@color/black"
            android:textColorHint="@color/hint_text_color" />
    </TableRow>

30
OP并不希望TextView始终有四行,无论其中的文本长度如何。 - tar
7
这个答案对我有用。但是我不是通过使用maxlines和lines来获得最佳结果的,而是通过使用maxlines和minlines,并且没有使用lines。我将minlines设为1,将maxlines设为大于最大数据的值。这样,我可以在一个紧凑的视图中获取从1到N行的数据。 - R Earle Harris
1
@REarleHarris:我也尝试了相同的解决方案,但问题是它没有采用maxLines计数。所有数据都以minLines计数显示。现在我正在xml中使用自定义textview,我该尝试什么? - Sagar Devanga

136

我想补充一点,如果您使用:

android:inputType="textMultiLine"

那么视图将不再可点击。我试图在我的滑动菜单中获得多行文本视图,这显然需要响应点击操作。

但是android:singleLine="false"可以正常工作。


4
这并不完全正确,因为Android自己的lint错误建议你只在EditText而不是TextView中使用这个属性。 - Jared
1
你是在指textMultiline吗?我说过不要使用它。在TextView上使用singleLine就可以了:http://developer.android.com/reference/android/widget/TextView.html#attr_android:singleLine - Ryan
4
android:singleLine现已过时。 - Humberto Castañeda
3
android:singleLine="false" 已经过时,因为它是默认值。 - Ashraf Alshahawy
@AshrafAlshahawy 如果你根据文档没有指定输入类型,那么这只是正确的。我发表这篇文章已经有一段时间了,但当时我肯定必须手动设置它才能获得所需的行为(而且根据事实,多年后仍然被点赞,其他人也是如此)。很奇怪吧。也许我确实设置了一个输入类型,但它是一个TextView,而不是EditText,我在菜单中使用它,所以我怀疑。 - Ryan
显示剩余2条评论

31

我对这两个答案都不满意。只需设置输入类型,TextView 将适应其内容。

<TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:inputType="textMultiLine"/>

在 Nexus One (2.3) 和 Nexus 4 (4.4) 上进行了测试。


63
android:inputType="textMultiLine" 不适用于 TextView,而是适用于 EditText。如果您尝试这样做,会收到警告。 - bhaskarc
2
你应该听取警告。使用 @Ryans 的解决方案。 - m02ph3u5

21

在文本中简单地加入 '\n' 即可... 不需要额外的属性 :)

          <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textAppearance="?android:attr/textAppearanceLarge"
            android:text="Pigeon\nControl\nServices"
            android:id="@+id/textView5"
            android:layout_gravity="center"
            android:paddingLeft="12dp"/> 

10
此解决方案无法用于动态设置文本。 - Sagar Devanga
@SagarDevanga 动态设置文本是什么意思? - juil
4
@SagarDevanga,我刚刚检查了一下,如果使用\n,动态和静态文本默认为多行文本,因此这是正确的解决方案。不需要使用 singleLine=false,也不需要使用 lines=4 等其他属性。 - CoolMind

11

只需在ScrollView中添加TextView即可。

<ScrollView
           android:layout_width="fill_parent"
           android:layout_height="wrap_content"
           android:layout_weight="1"
           android:layout_marginLeft="15dp"
           android:layout_marginRight="15dp"
           android:layout_marginTop="20dp"
           android:fillViewport="true">

           <TextView
               android:id="@+id/txtquestion"
               android:layout_width="fill_parent"
               android:layout_height="match_parent"
               android:background="@drawable/abs__dialog_full_holo_light"
               android:lines="20"
               android:scrollHorizontally="false"
               android:scrollbars="vertical"
               android:textSize="15sp" />

       </ScrollView>

8
我学到的是在希望文字换行的单词之间添加“\n”。例如...
<TextView
    android:id="@+id/time"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textAlignment="center"
    android:text="M-F 9am-5pm \n By Appointment Only" />

在5pm和By之间的\n让我更加掌握了下一行的起始和结束位置。


6

尝试通过将EditText设置为不可点击和不可聚焦来使用它,还可以显示滚动条并删除EditText的底部横线。
以下是一个示例:

<EditText
android:id="@+id/my_edit_text"
android:layout_width="match_parent"
android:layout_height="wrap_parent"
android:inputType="textMultiLine"                   <!-- multiline -->
android:clickable="false"                         <!-- unclickable -->
android:focusable="false"                         <!-- unfocusable -->
android:scrollbars="vertical"     <!-- enable scrolling vertically -->
android:background="@android:color/transparent"   <!-- hide the underbar of EditText -->
/>  

希望这可以帮助你 :)

5

我不喜欢强制在文本视图中设置行数的解决方案。我更建议您通过这里提出的解决方案来解决它。正如我所看到的,原始帖子的作者也在为使文本视图在表格中显示得更好而苦恼,传递shrinkColumns指令是实现所需效果的正确方法。


3

首先将 "\n" 替换为其 Html 等效项 "&lt;br&gt;",然后对字符串调用 Html.fromHtml()。按照下面的步骤操作:

String text= model.getMessageBody().toString().replace("\n", "&lt;br&gt;")
textView.setText(Html.fromHtml(Html.fromHtml(text).toString()))

这个非常完美。


3

如果您想要至少4行,请添加android:minLines="4"

<TextView android:id="@+id/address1"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"
    android:gravity="left"
    android:minLines="4"
    android:text="Johar Mor, Gulistan-e-Johar, Karachi" />

如果您想始终显示4行,请添加android:lines="4"

<TextView android:id="@+id/address1"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"
    android:gravity="left"
    android:lines="4"
    android:text="Johar Mor, Gulistan-e-Johar, Karachi" />

如果您想要最多4行,请添加android:maxLines="4"

<TextView android:id="@+id/address1"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"
    android:gravity="left"
    android:maxLines="4"
    android:text="Johar Mor, Gulistan-e-Johar, Karachi" />

1
这是一个警告。不应该用于TextView。 - Stealth Rabbi
1
inputType仅支持EditText组件。 - Chamin Wickramarathna

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