上下文:我有一个TableLayout(使用XML创建),它有一个TableRow,它有一个TextView。代码:
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:fillViewport="true"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TableLayout
android:id="@+id/mytable"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:stretchColumns="1"
>
<TableRow>
<TextView
android:id="@+id/add_alarm"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="fill_parent"
android:gravity="center"
android:text="New\nItem"
android:textSize="30sp"
/>
</TableRow>
</TableLayout>
</ScrollView>
在我的Activity的onCreate()方法中,我试图动态地向TableRow添加另一个View。这是代码:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LayoutInflater inflater = LayoutInflater.from(this);
View mainLayout = inflater.inflate(R.layout.main, null);
TableLayout tl = (TableLayout) mainLayout.findViewById(R.id.mytable);
TableRow tr = (TableRow) tl.getChildAt(0);
Log.d(TAG, "tr class = " + tr.getClass().getName() + " | width = " + tr.getWidth() + "\n");
final RelativeLayout rl = (RelativeLayout) inflater.inflate(R.layout.alarm_widget, null);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.WRAP_CONTENT, 1);
tr.addView(rl, lp);
tl.invalidate();
setContentView(mainLayout);
}
问题:此代码没有预期的效果,即在宽度相等的列中同时显示两个视图(已在XML布局中添加动态,另一个动态添加)。
tr.addView(rl)
(即不参考LayoutParams),则动态添加的视图是可见的,但列的宽度不相等。我怎样才能做到这一点?
修改:我根据以下注释更改了代码。它仍然没有按预期工作:
TableLayout.LayoutParams lp = new TableLayout.LayoutParams(TableLayout.LayoutParams.MATCH_PARENT,
TableLayout.LayoutParams.WRAP_CONTENT, 1f);
tr.addView(rl, lp);
答案 0 :(得分:3)
问题是为TableRow定义的此行为:
TableRow的子节点不需要在XML文件中指定layout_width和layout_height属性。 TableRow始终将这些值分别强制为MATCH_PARENT和WRAP_CONTENT。
不要将文本视图直接添加到TableRow,而是让TableRow保持水平LinearLayout并将第二个视图添加到该持有者。
(另外,对于进入TableRow的东西使用LinearLayout.LayoutParams是错误的。你应该使用TableRow.LayoutParams。但这不是获得等宽文本视图的方法。使用LinearLayout持有者。)
答案 1 :(得分:0)
我认为将项目动态添加到TableRow并不是一个好主意 - 它会破坏使用表格的目的。想象一下,如果你将一个项目添加到表格的第一行,而不是第二行,这意味着第一行有更多的元素。它看起来不像桌子。
但如果你坚持,
来自开发者指南:
The children of a TableRow do not need to specify the layout_width and layout_height attributes in the XML file. TableRow always enforces those values to be respectively MATCH_PARENT and WRAP_CONTENT.
您可能需要开始查看每个元素的layout_weight。尝试在行的静态元素上添加layout_weight=1
,然后将动态RelativeLayout的权重设置为1,然后再将其添加到行中。
rl.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT, 1f));
最后一个参数是重量。
答案 2 :(得分:0)
This question与您的相似(接受的答案将是我推荐的答案 - 请注意评论)。
答案 3 :(得分:0)
像这样为包含 ScrollView 的布局设置高度。 它解决了我自己的问题,即 tablelayout 不显示最后一行。
android:layout_height="0dp"