Android中的多行TextView?

Posted

技术标签:

【中文标题】Android中的多行TextView?【英文标题】:Multiline TextView in Android? 【发布时间】:2011-10-04 05:05:56 【问题描述】:

我在xml下面做了喜欢

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

它不适用于multiline,我正在使用TableLayout...

那么我在这里做错了什么?

【问题讨论】:

【参考方案1】:

当 TextView 没有足够的空间容纳单行并且 singLine 未设置为 true 时,它​​将是多行。

如果它在一行中获得空间,则不会是多行。

【讨论】:

如果我想使用 fill_parent 而不是固定宽度怎么办?我的内容被删了,如果我这样做... 我会尝试android:singleLine="false"android:inputType="textMultiLine"(如 Marageus 所述)。请注意,android:inputType="textMultiLine" 在两者都存在时优先 分享其他评论者的观点,这是完全错误的,我对为什么这是公认的答案感到目瞪口呆。【参考方案2】:

如果您在TextView 中输入的文本很短,它不会自动扩展为四行。如果您希望TextView 始终 有四行,而不管其中文本的长度,请设置 android:lines 属性:

<TextView
    android:id="@+id/address1"
    android:gravity="left"
    android:layout_
    android:layout_
    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_
            android:layout_
            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_
            android:layout_
            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>

【讨论】:

OP “希望 TextView 始终有四行,无论其中文本的长度如何”。 这个答案对我有用。但是我得到了最好的结果,不是使用 maxlines 和lines,而是使用 maxlines 和 minlines 并且没有使用lines。我将 minlines 设置为 1,将 maxlines 设置为大于最大数据。这样我就可以得到 1 到 N 行的紧凑视图数据。 @REarleHarris :我也尝试了相同的解决方案,但问题是它没有计算 maxLines 计数。所有数据都以 minLines 计数显示。我现在可以尝试什么我在 xml 中使用自定义文本视图【参考方案3】:

我不喜欢强制文本视图中行数的解决方案。我宁愿建议您通过解决方案proposed here 来解决它。正如我所看到的,OP 也在努力使文本视图在表格中看起来像正确的那样,shrinkColumns 是传递以实现所需的正确指令。

【讨论】:

【参考方案4】:

我不喜欢这两个答案。只需设置 inputType,TextView 就会适应它的内容

<TextView
            android:layout_
            android:layout_
            android:inputType="textMultiLine"/>

在 Nexus One (2.3) 和 Nexus 4 (4.4) 上测试

【讨论】:

android:inputType="textMultiLine" 不适用于 TextView,它适用于 EditText,如果您尝试这样做,则会收到警告 您应该听取警告。使用@Ryans 解决方案。【参考方案5】:

只需在 ScrollView 中添加 textview

<ScrollView
           android:layout_
           android:layout_
           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_
               android:layout_
               android:background="@drawable/abs__dialog_full_holo_light"
               android:lines="20"
               android:scrollHorizontally="false"
               android:scrollbars="vertical"
               android:textSize="15sp" />

       </ScrollView>

【讨论】:

【参考方案6】:

我用过:

TableLayout tablelayout = (TableLayout) view.findViewById(R.id.table);
tablelayout.setColumnShrinkable(1,true);

它对我有用。 1 是列数。

【讨论】:

【参考方案7】:

我只是想如果你使用的话我会添加:

android:inputType="textMultiLine"

然后视图停止可点击。我试图在我的滑动抽屉菜单中获得多行文本视图,这显然需要响应点击。

android:singleLine="false" 工作正常。

【讨论】:

这并不完全正确,因为 Android 自己的 lint 错误表明您只能将此属性与 EditText 而不是 TextView 一起使用。 你指的是textMultiline吗?我说 使用它。 singleLine 在 TextViews 上很好:developer.android.com/reference/android/widget/… android:singleLine 现已弃用 你确定吗?它没有提到我在上述评论中链接到的文档中,尽管我刚刚看到它在 res 文档中被标记为这样。奇怪的是,他们没有在 TextView 页面上提到这一点。问题是他们建议的解决方法(多行)在我放入我的 OP 时阻止了可点击的视图。 developer.android.com/reference/android/R.attr.html#singleLine android:singleLine="false" 已弃用,因为它是默认值【参考方案8】:

只需将 '\n' 放在文本中...不需要额外的属性 :)

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

【讨论】:

此方案不能用于动态设置文本 @SagarDevanga 动态设置文本是什么意思? @SagarDevanga,我刚刚检查过,动态和静态文本默认是多行的(如果使用\n),所以这是一个正确的解决方案。没有singleLine=false,没有lines=4等等。【参考方案9】:

你为什么不声明一个字符串而不是在布局文件中写入长行。为此,您必须在布局文件 'android:text="@string/text"' 中声明一行代码,然后转到 \\app\src\main\res\values\strings.xml 并添加一行代码'Your multiline text here' 也可以使用 '\n' 从任何点换行,否则行将自动调整。

【讨论】:

【参考方案10】:

我学到的是在你希望它进入下一行的单词之间添加“\n”。比如……

<TextView
    android:id="@+id/time"
    android:layout_
    android:layout_
    android:textAlignment="center"
    android:text="M-F 9am-5pm \n By Appointment Only" />

下午 5 点到 By 之间的 \n 让我可以更好地控制下一行的开始和结束位置。

【讨论】:

【参考方案11】:

尝试通过使其不可点击和不可聚焦来使用 EditText,您也可以显示滚动条并删除 EditText 的下栏。 这是一个例子:

<EditText
android:id="@+id/my_edit_text"
android:layout_
android:layout_
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 -->
/>  

希望这会有所帮助:)

【讨论】:

【参考方案12】:

我为多行 TextView 找到的最佳答案是:

android:inputType="textMultiLine"

【讨论】:

android:inputType 不是 &lt;EditText&gt; 的属性,而不是 &lt;TextView&gt; 的属性吗? 如果将此属性添加到 TextView,则会出现警告。 - 属性 android:inputType="textMultiLine" 不应与 一起使用。实际上这个属性是针对 EditText 的。【参考方案13】:

首先将"\n" 替换为其Html 等价的"&amp;lt;br&amp;gt;" 然后在字符串上调用Html.fromHtml()。请按照以下步骤操作:

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

这很好用。

【讨论】:

【参考方案14】:

对我来说,没有一个解决方案不起作用。 我知道这不是这个问题的完整答案,但有时它会有所帮助。

我在垂直线性布局中放置了 4 个文本视图。

<Linearlayout
    android:layout_
    android:layout_
    android:orientation:"vertical"

    ...>
    <TextView
       android:layout_
       android:layout_
       android:text:"line1"
       .../>
    <TextView
       android:layout_
       android:layout_
       android:text:"line2"
       .../>
    <TextView
       android:layout_
       android:layout_
       android:text:"line3"
       .../>
    <TextView
       android:layout_
       android:layout_
       android:text:"line4"
       .../>
</LinearLayout>

此解决方案适用于文本视图文本不变的情况,例如标签。

【讨论】:

请不要这样做。【参考方案15】:
You can do this with TableRow, see below code

<TableRow >
    <TextView
        android:id="@+id/tv_description_heading"
        android:layout_
        android:layout_
        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_
        android:layout_
        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>

【讨论】:

【参考方案16】:

你可以使用 android:inputType="textMultiLine"

  <TextView android:id="@+id/address1"
    android:layout_ 
    android:layout_
    android:gravity="left"
    android:maxLines="4" 
    android:inputType="textMultiLine"
    android:text="Johar Mor, Gulistan-e-Johar, Karachi" />

【讨论】:

这显示为警告。不适用于 TextView inputType 仅支持 EditText 组件。【参考方案17】:

最简单的方法

<TableRow>
    <TextView android:id="@+id/address1"
        android:layout_ 
        android:layout_
        android:gravity="left"
        android:maxLines="4" 
        android:singleLine="false"              
        android:text="Johar Mor,\n Gulistan-e-Johar,\n Karachi" >
    </TextView> 
</TableRow>

在要插入新行的地方使用\n 希望对你有帮助

【讨论】:

【参考方案18】:

关键是带有singleline=false 的Textview(是的已弃用,但必须工作)结合linesmaxlinesminlines

<TextView
                android:id="@+id/txtBowlers"
                style="@style/Default_TextBox.Small"
                android:layout_
                android:layout_
                android:layout_marginTop="4dp"
                android:singleLine="false"
                android:maxLines="6"
                android:text="Bob\nSally\nJohn"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintHorizontal_bias="0.0"
                app:layout_constraintStart_toStartOf="@+id/txtTeamName"
                app:layout_constraintTop_toBottomOf="@+id/txtTeamName"/>

【讨论】:

【参考方案19】:

我希望这些答案有点旧,只需更改资源布局文件中的输入类型即可解决您的问题。例如:

<EditText
        android:id="@+id/notesInput"
        android:hint="Notes"
        android:inputType="textMultiLine"
/>

【讨论】:

【参考方案20】:

以下代码适用于单行和多行文本视图

isMultiLine = 如果为 true,则 Textview 显示为多行,否则为单行

    if (isMultiLine) 
        textView.setElegantTextHeight(true);
        textView.setInputType(InputType.TYPE_TEXT_FLAG_MULTI_LINE);
        textView.setSingleLine(false);
        
     else 
        textView.setSingleLine(true);
        textView.setEllipsize(TextUtils.TruncateAt.END);
    

【讨论】:

您需要在 TextView 上设置输入类型,即使它不是 EditText?

以上是关于Android中的多行TextView?的主要内容,如果未能解决你的问题,请参考以下文章

TextView 使用详解

android.widget.TextView.setTextAlignment():java.lang.NoSuchMethodError

Android 并在 TableRow 的 TextView 中显示多行文本

Android TextView 多行问题(去掉第二行的gab)

在Android中格式化多行TextView的第一行

Android TextView 不会用多行紧紧地拥抱文本,而是坚持使用 maxWidth