使用Java而不是xml时,多行文本中的行为不同

时间:2011-12-26 12:00:23

标签: java android android-layout

我的问题是多行文字在我的xml模板中正常工作。如果文本比屏幕宽,它将包装到下一行。但是如果我在Java中尝试相同的话,文本将不会被包装:

我有以下xml模板用于测试我的预期布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="center_vertical|center_horizontal"
    >
    <ScrollView 
            android:id="@+id/scrollView"
            android:layout_width="fill_parent" 
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical|center_horizontal">
    <TableLayout 
            android:id="@+id/messageTable"
            android:layout_height="wrap_content"
            android:layout_width="fill_parent"
            android:stretchColumns="*"
            android:clickable="false">
        <TableRow
            android:layout_width="fill_parent"
            android:background="#777777"
            android:textColor="#FFFFFF"
            android:clickable="false">
            <TextView 
                 android:id="@+id/topic"
                 android:text="This is the topic"            
                 android:textColor="#FFFFFF"
                 android:layout_width="fill_parent"
                 android:textSize="14sp"
                 android:paddingLeft="5sp"
                 android:paddingRight="5sp"
                 android:paddingTop="2sp"
                 android:paddingBottom="2sp"
                 android:textStyle="bold" 
                 android:clickable="false"  
                 />
        </TableRow>
         <TableRow>
            <TextView
                 android:text="Mo., 26.12.2011, 10:00 - This is some example text. It will be wrapped in view. This works."
                 android:textSize="14sp"
                 android:paddingLeft="5sp"
                 android:paddingRight="5sp"
                 android:paddingTop="2sp"
                 android:paddingBottom="2sp"
                 android:scrollHorizontally="false"
                 android:inputType="textMultiLine"
                 android:longClickable="false"
                 android:clickable="false"
                 android:layout_width="0sp"
                 />
        </TableRow>
.
.
.

现在我想在我的Java代码中使用这些xml的一部分。应该动态生成表行,具体取决于我将在实际应用程序中收到的数据。现在,真实应用程序的xml看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="center_vertical|center_horizontal"
    >
    <ScrollView 
            android:id="@+id/scrollView"
            android:layout_width="fill_parent" 
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical|center_horizontal">
    <TableLayout 
            android:id="@+id/messageTable"
            android:layout_height="wrap_content"
            android:layout_width="fill_parent"
            android:stretchColumns="*"
            android:clickable="false">
    </TableLayout>
.
.
.

在代码中,我为文本行,文本主题和文本正文使用自己的类型:

TopicTableRow:

public class TopicTableRow extends TableRow {

    public TopicTableRow(Context context) {
        super(context);

        setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
        setBackgroundColor(Color.parseColor("#777777"));
        setClickable(false);
    }
}

TopicTextView:

public class TopicTextView extends TextView {

    public final String TAG = "TopicTextView";

    public TopicTextView(Context context) {
        super(context);

        PixelCalc pixelCalc = new PixelCalc(context, TAG);

        setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
        setPadding(pixelCalc.scaledPixelToPixel(5), pixelCalc.scaledPixelToPixel(2), pixelCalc.scaledPixelToPixel(5), pixelCalc.scaledPixelToPixel(2));

        setTextColor(Color.parseColor("#FFFFFF"));
        setTextSize(TypedValue.COMPLEX_UNIT_SP, 14f);
        setTypeface(Typeface.DEFAULT_BOLD);

        setClickable(false);
    }
}

和BodyTextView(不包装文本)如下所示:

public class BodyTextView extends TextView {

    public final String TAG = "BodyTextView";

    public BodyTextView(Context context) {
        super(context);

        PixelCalc pixelCalc = new PixelCalc(context, TAG);

        setLayoutParams(new LayoutParams(0, LayoutParams.WRAP_CONTENT));
        setPadding(pixelCalc.scaledPixelToPixel(5), pixelCalc.scaledPixelToPixel(2), pixelCalc.scaledPixelToPixel(5), pixelCalc.scaledPixelToPixel(2));

        setClickable(false);
        setLongClickable(false);

        setHorizontallyScrolling(false);

        setTextSize(TypedValue.COMPLEX_UNIT_SP, 14f);
            setInputType(InputType.TYPE_TEXT_FLAG_MULTI_LINE); 
    }
}

(如您所见,宽度设置与模板XML中的宽度设置完全相同)。 在Java代码中,我添加了一个主题,后跟一个“正文”。这些是方法。 (一切正常,但文字没有被包裹。):

private void addTopic(String text)  {
    TopicTableRow topicTableRow = new TopicTableRow(this);
    TopicTextView topicTextView = new TopicTextView(this);

    topicTextView.setText(text);

    topicTableRow.addView(topicTextView);
    messageTable.addView(topicTableRow);        
}

private void addStandardText()  {
    TableRow tableRow = new TableRow(this);
    BodyTextView bodyTextView = new BodyTextView(this);

    bodyTextView.setText(getString(R.string.standardText));

    tableRow.addView(bodyTextView);
    messageTable.addView(tableRow);
}

我怀疑BodyTextView的行setLayoutParams(new LayoutParams(0, LayoutParams.WRAP_CONTENT));无法正常工作,因为当我将layoutWidth设置为100或200时,宽度将不会最小化并突出显示在屏幕外。为什么会这样?如果我尝试将主题缩短为200(TopicTextView),我会得到一个较小的条,因此Java方法应该可以正常工作,但在BodyTextView中,它会以某种方式忽略宽度。有谁知道为什么会这样?我已经考虑过this bug,但我不确定。

2 个答案:

答案 0 :(得分:1)

解决: 我不知道为什么,但是......

<强> setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_MULTI_LINE);

而不是

<强> setInputType(InputType.TYPE_TEXT_FLAG_MULTI_LINE);

完成这项工作。

答案 1 :(得分:0)

而不是
机器人:stretchColumns = “*”`
使用
机器人:shrinkcolumns = “0”
或者参考此链接:http://android-pro.blogspot.com/2010/02/table-layout.html