79

谁能告诉我文字出了什么问题?超过一行的文本不会换行到下一行,而是超出屏幕。

以下是代码:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"
    android:orientation="horizontal" 
    android:padding="4dip">

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content"
        android:orientation="vertical" 
        android:padding="4dip">

        <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="fill_parent" 
            android:layout_height="wrap_content"
            android:orientation="horizontal" 
            android:padding="4dip">
            <TextView 
                android:id="@+id/reviewItemEntityName"
                android:layout_width="wrap_content" 
                android:layout_height="wrap_content"
                android:text="event/venue" 
                android:textColor="@color/maroon"
                android:singleLine="true" 
                android:ellipsize="end" 
                android:textSize="14sp"
                android:textStyle="bold" 
                android:layout_weight="1" />

            <ImageView 
                android:id="@+id/reviewItemStarRating"
                android:layout_width="wrap_content" 
                android:layout_height="wrap_content"
                android:layout_alignParentTop="true"
                android:layout_alignParentBottom="true"
                android:src="@drawable/title_1_star" />
        </LinearLayout>

        <TextView 
            android:id="@+id/reviewItemDescription"
            android:layout_width="fill_parent" 
            android:layout_height="wrap_content"
            android:text="Description comes here" 
            android:textSize="12sp" 
            android:layout_weight="1"/>
    </LinearLayout>
</LinearLayout>
4

24 回答 24

85

我自己修好了,关键是android:width="0dip"

<LinearLayout 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="4dip"
    android:layout_weight="1">

    <LinearLayout 
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:padding="4dip">

        <TextView
            android:id="@+id/reviewItemEntityName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="@color/maroon"
            android:singleLine="true"
            android:ellipsize="end"
            android:textSize="14sp"
            android:textStyle="bold"
            android:layout_weight="1" />

        <ImageView
            android:id="@+id/reviewItemStarRating"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:layout_alignParentBottom="true" />
        </LinearLayout>

        <TextView
            android:id="@+id/reviewItemDescription"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:textSize="12sp"
            android:width="0dip" />

    </LinearLayout>

    <ImageView
        android:id="@+id/widget01"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/arrow_nxt"
        android:layout_gravity="center_vertical"
        android:paddingRight="5dip" />

</LinearLayout> 

于 2010-02-04T08:11:51.117 回答
39

这个问题的唯一正确答案是您需要将父母设置为适当的宽度(在本例中为FILL_PARENT, WRAP_CONTENT)并android:layout_weight=1用于需要包装的文本视图。

SingleLine默认情况下是打开的,因此不会进行任何更改。

设置为 0px将width起作用,但不是一个好的解决方案。

使用 xml 的一些示例(这次是在 tableview 中):

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent" android:layout_height="fill_parent"
    android:orientation="vertical">
    <TableLayout android:layout_width="fill_parent"
        android:layout_height="wrap_content" android:stretchColumns="*"
        android:id="@+id/tableLayout1">
        <TableRow android:id="@+id/tableRow1" android:layout_width="fill_parent"
            android:layout_height="wrap_content">
            <TextView android:text="test1" android:layout_width="fill_parent"
                android:layout_height="wrap_content" android:layout_weight="0" />
            <TextView android:layout_weight="1"
                android:text="test2 very long text that needs to be wrapped properly using layout_weight property and ignoring singleline since that is set by default..."
                android:layout_width="fill_parent" android:layout_height="wrap_content" />
        </TableRow>     
    </TableLayout>
</LinearLayout>

如果您想在代码中设置它,您正在寻找 layout_weight 作为第三个参数,如本示例中设置为 1 的示例:

row.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,
                LayoutParams.WRAP_CONTENT));
TextView label = new TextView(getApplicationContext());
label.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,
                LayoutParams.WRAP_CONTENT, 1f));
于 2011-08-31T09:20:15.263 回答
20

您必须使用 2 个参数:

  • android:ellipsize="none":文本未在 textview 宽度上剪切

  • android:scrollHorizontally="false"文本根据需要在尽可能多的行上换行

于 2011-03-02T14:21:41.640 回答
14

在您的 xml 文件中使用就足够了。

android:singleLine="false".

希望它会奏效。

祝一切顺利!

于 2013-05-21T09:29:53.037 回答
11

使用TableLayout>TableRow>TextView. 然后我发现TableLayout.shrinkColumns="*". 唯一可行的其他解决方案是强制 TextViewlayout_width:250px等,但我不喜欢这样强制宽度。

如果使用表格,请尝试这样的事情。

            <TableLayout 
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:shrinkColumns="*">

注意你需要shrinkColumns="*"

这显然是在一个<LinearLayout>. 所以像<LinearLayout> <TableLayout> <TableRow> <TextView>

参考:

表格布局

http://code.google.com/p/android/issues/detail?id=4000

希望对某人有所帮助。

于 2011-06-24T03:35:29.073 回答
4

您的布局参数之一在您的代码中是错误的。在第一个 TextView

android:layout_width="wrap_content"

改成

android:layout_width="fill_parent" 

超出屏幕宽度大小的文本将换行到下一行并设置android:singleline="false".

于 2010-02-25T06:29:19.070 回答
3

设置文本视图的高度android:minHeight="some pixes"android:width="some pixels". 它将解决问题。

于 2011-03-21T13:55:45.467 回答
3

对于我的情况,删除输入类型起到了作用,我使用的是 android:inputType="textPostalAddress" 因为我的文本视图被粘在一行并且没有换行,删除这个解决了这个问题。

于 2013-10-27T16:55:29.210 回答
1

我是 Android(和 GUI)初学者,但在软件方面有很多经验。我已经阅读了一些教程,这是我的理解:

layout_width 和 layout_height 是 TextView 的属性。它们是关于 TextView 应该如何塑造自身的说明,它们并不是指如何处理 TextView 中的内容。

如果你使用“fill_parent”,你是说 TextView 应该相对于它的父视图来塑造自己,它应该填充它。

如果你使用“wrap_content”,你是说你应该忽略父视图,让 TextView 的内容定义它的形状。

我认为这是令人困惑的地方。“wrap_content”并没有告诉 TextView 如何管理它的内容(以换行),它告诉它应该相对于它的内容来塑造自己。在这种情况下,没有换行符,它会自行调整,以便所有文本都在一行上(不幸的是,它溢出了父行)。

我认为您希望它水平填充父级,并垂直包装它的内容。

于 2011-12-18T18:45:21.070 回答
1

尽管这是一个旧线程,但我想分享我的经验,因为它对我有帮助。我的应用程序在 OS 2.0 和 4.0+ 上运行良好,但对于运行 OS 3.x 的 HTC 手机,文本没有换行。对我有用的是包含这两个标签。

android:maxLines="100"
android:scrollHorizontally="false"

如果您消除其中任何一个,则它仅适用于 os 3.0 设备。“ellipsize”参数具有中性效果。这是下面的完整 textview 标签

<TextView
                android:id="@+id/cell_description"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:paddingTop="5dp"
                android:maxLines="100"
                android:scrollHorizontally="false"
                android:textStyle="normal"
                android:textSize="11sp"
                android:textColor="@color/listcell_detail"/>

希望这会对某人有所帮助。

于 2013-03-15T07:45:06.147 回答
1

增加高度,即。android:height="Some size" ,对我来说效果很好。

于 2014-06-09T13:32:07.440 回答
1

我有一个类似的问题,我的两个水平加权 TextView 没有换行文本。后来我发现问题是因为我的 viewparents 父母有 wrap_content 而不是 match_parent。

于 2015-06-04T09:09:09.453 回答
0

你必须android:singleLine="false"在你的TextView标签中使用。

于 2010-02-16T18:19:16.513 回答
0

我认为这取决于显示器中布局的特定组合。某些标志可能会被覆盖或忽略。我有一个带有选项卡的 TabHost,每个选项卡都是一个表列表。所以它是ListView的一个tab,每一行都是TextView的一个TableLayout。我尝试了上面列出的修复程序,但都没有奏效。

于 2010-08-26T16:31:54.410 回答
0

我知道,有问题是正确的,但就我而言,问题在于在“dp”中设置 textSize 属性 - 我已将其更改为“sp”,它工作正常。

于 2014-08-20T08:21:00.417 回答
0

就我而言,通过TableRow > ScrollView > TextView嵌套,我通过设置android:layout_widthfill_parentonTableRow和 to wrap_contenton ScrollViewand解决了这个问题TextView

于 2015-05-04T04:56:47.107 回答
0

我终于设法在 TextView 的高度上添加了一些像素来解决这个问题。

首先,您需要实际获取 TextView 的高度。这并不简单,因为它在绘制之前为 0。

将此代码添加到 onCreate:

mReceiveInfoTextView = (TextView) findViewById(R.id.receive_info_txt);
if (mReceiveInfoTextView != null) { 
    final ViewTreeObserver observer = mReceiveInfoTextView.getViewTreeObserver();
    observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            int height = mReceiveInfoTextView.getHeight();
            int addHeight = getResources().getDimensionPixelSize(R.dimen.view_add_height);
            mReceiveInfoTextView.setHeight(height + addHeight);

            // Remove the listener if possible
            ViewTreeObserver viewTreeObserver = mReceiveInfoTextView.getViewTreeObserver();
            if (viewTreeObserver.isAlive()) {
                viewTreeObserver.removeOnGlobalLayoutListener(this);
            }
        }
    });
}

您需要将此行添加到dimens.xml

<dimen name="view_add_height">10dp</dimen>

希望能帮助到你。

于 2016-04-04T10:36:32.967 回答
0

我刚刚删除android:lines="1"并添加了android:maxLines="2",这使文本自动换行。问题是android:lines属性。这会导致文本换行不会发生。

我不必使用maxEmssingleLine="false"(已弃用的 API)来解决此问题。

于 2016-06-27T10:08:03.770 回答
0

我花了几个小时才发现在我试图显示的文本中包含一个单引号(在 string.xml 中)所以我只是用一个反斜杠对其进行了转义,它工作得很好 => TextView 的高度正确地包装了文本:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:paddingLeft="16dp"
    android:paddingRight="16dp"
    android:paddingTop="16dp"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:fontFamily="sans-serif-smallcaps"
        android:text="@string/instructions"
        android:textAlignment="center"
        android:textSize="18sp"
        android:textStyle="bold" />

    <EditText
        android:id="@+id/keyword"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/defaultKeyword"
        android:textSize="22sp"
        />
于 2017-12-12T22:36:14.873 回答
0

我主要使用约束布局。

1) android:layout_width="match_parent"= 尝试拉伸以符合边缘

2) android:layout_width="wrap_content"= 仅基于输入文本,不考虑附近的其他视图。例如添加android:textAlignment="center"将改变文本的形状

3)android:padding="12dp" android:layout_width="0dp" android:layout_weight="1" android:singleLine="false"

= 文本将折叠以适应附近的布局,而不考虑文本本身

于 2018-08-15T15:56:26.203 回答
-1

我把这个属性:

android:inputType="textMultiLine"

进入我的TextView,它有换行,用户可以“输入”换行。

==================================================== ==========

当你来到这篇文章时,你可能想要创建一个可以显示多行的 Big TextView,因此可能还需要这些属性

android:layout_height="Xdp" //where X is a number depends on how big Textview you want
android:gravity="top" //in order to make your text start from the top of your TextView.
于 2014-03-13T03:39:21.850 回答
-1

我曾经android:ems="23"解决我的问题。只需将 23 替换为您情况下的最佳值即可。

<TextView
        android:id="@+id/msg"
        android:ems="23"
        android:text="ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab "
        android:textColor="@color/white"
        android:textStyle="bold"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
于 2015-02-09T15:33:20.937 回答
-1

我在字符串中间添加了一个 \n ,看起来还不错。

于 2017-03-07T00:56:53.480 回答
-5

为了包装文本并将文本放在下一行,我们应该在布局 xml 文件中使用“\n”,即换行符,并检查模拟器上的更改而不是布局屏幕上的更改。

于 2011-08-11T10:20:23.527 回答