TableLayout(TableRow?)在动态添加子视图时没有按预期调整子视图大小

时间:2011-12-16 17:49:23

标签: android android-layout

上下文:我有一个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布局中添加动态,另一个动态添加)。

  1. 使用上面给出的代码,动态添加的View的宽度为“0”,因此不可见。
  2. 如果我将代码更改为tr.addView(rl)(即不参考LayoutParams),则动态添加的视图是可见的,但列的宽度不相等。
  3. 我怎样才能做到这一点?

    修改:我根据以下注释更改了代码。它仍然没有按预期工作:

    TableLayout.LayoutParams lp = new TableLayout.LayoutParams(TableLayout.LayoutParams.MATCH_PARENT,
                                   TableLayout.LayoutParams.WRAP_CONTENT, 1f);
    tr.addView(rl, lp); 
    

4 个答案:

答案 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"