Android TextView Text没有被包装

时间:2010-02-04 06:22:28

标签: android textview

有谁能告诉我文字出了什么问题?长于一行的文本不会换行到下一行但超出屏幕。

以下是代码:

<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>

24 个答案:

答案 0 :(得分:77)

我自己修好了,关键是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> 

答案 1 :(得分:40)

此问题的唯一正确答案是您需要将父级设置为适当的宽度(在本例中为FILL_PARENTWRAP_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));

答案 2 :(得分:19)

您必须使用2个参数:

  • android:ellipsize="none":文字未在文字视图宽度上剪切

  • android:scrollHorizontally="false"文本根据需要包含多行

答案 3 :(得分:12)

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

android:singleLine="false".

希望它能奏效。

一切顺利!

答案 4 :(得分:10)

使用TableLayout>TableRow>TextView时,我无法使用任何这些解决方案。然后我找到了TableLayout.shrinkColumns="*"。唯一有效的解决方案是将TextView强制转换为layout_width:250px等,但我不喜欢强制像这样的宽度。

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

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

请注意,您需要shrinkColumns="*"

这显然属于<LinearLayout>。像<LinearLayout> <TableLayout> <TableRow> <TextView>

这样的东西

的引用:

TableLayout

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

希望能有所帮助。

答案 5 :(得分:4)

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

android:layout_width="wrap_content"

更改为

android:layout_width="fill_parent" 

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

答案 6 :(得分:3)

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

答案 7 :(得分:3)

对于我的情况删除输入类型做了伎俩,我使用android:inputType =&#34; textPostalAddress&#34;由于我的textview坚持一行并且没有包装,删除它修复了这个问题。

答案 8 :(得分:2)

我是一名Android(和GUI)初学者,但拥有丰富的软件经验。我已经阅读了一些教程,这是我的理解:

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

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

如果您使用“wrap_content”,则表示您应该忽略父视图,并让TextView的内容定义它的形状。

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

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

答案 9 :(得分:1)

即使这是一个老线程,我想分享我的经验,因为它帮助了我。我的应用程序适用于OS 2.0&amp; 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"/>

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

答案 10 :(得分:1)

增加高度,例如:android:height =&#34;有些尺寸&#34; ,它对我来说很好。

答案 11 :(得分:1)

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

答案 12 :(得分:0)

我花了好几个小时才发现在我试图显示的文本中包含一个引号(在string.xml中)所以我只是用反斜杠转义它并且它工作得很好=&gt; 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"
        />

答案 13 :(得分:0)

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

我没有必要使用android:linesmaxEms(已弃用的API)来解决此问题。

答案 14 :(得分: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"

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

答案 15 :(得分: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>

希望它有所帮助。

答案 16 :(得分:0)

在我的情况下,通过TableRow > ScrollView > TextView嵌套,我通过android:layout_width上的fill_parent设置为TableRowwrap_content设置ScrollView来解决问题1}}和TextView

答案 17 :(得分:0)

我使用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"/>

答案 18 :(得分:0)

我知道,这是正确的,但在我的情况下,问题是在'dp'中设置textSize属性 - 我已将其更改为'sp'并且它工作正常。

答案 19 :(得分:0)

我把这个属性:

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.

答案 20 :(得分:0)

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

答案 21 :(得分:0)

您必须在android:singleLine="false"标记中使用TextView

答案 22 :(得分:-1)

我在字符串中间加了一个\ n,它看起来没问题。

答案 23 :(得分:-5)

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