我的问题是多行文字在我的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,但我不确定。
答案 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