【问题标题】:TableLayout (TableRow?) not sizing child Views as expected when adding them dynamically动态添加子视图时,TableLayout(TableRow?)未按预期调整子视图的大小
【发布时间】:2012-01-22 05:06:24
【问题描述】:

上下文: 我有一个 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 添加另一个视图。代码如下:

    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),动态添加的视图是可见的,但列的宽度不相等。

我怎样才能做到这一点?

编辑:我将基于 cmets 的代码更改为以下内容。它仍然无法按预期工作:

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

【问题讨论】:

  • This question 与您的相似(接受的答案将是我推荐的答案 - 请注意 cmets)。

标签: android android-layout


【解决方案1】:

问题是为TableRow 定义的这种行为:

TableRow 的子项不需要在 XML 文件中指定 layout_width 和 layout_height 属性。 TableRow 始终强制这些值分别为 MATCH_PARENT 和 WRAP_CONTENT。

与其将文本视图直接添加到 TableRow,不如让 TableRow 保持水平 LinearLayout 并将第二个视图添加到该保持器。

(另外,将 LinearLayout.LayoutParams 用于进入 TableRow 的内容是错误的。您应该一直使用 TableRow.LayoutParams。但这不是获得等宽 TextViews 的方法。使用 LinearLayout 支架。)

【讨论】:

  • 感谢 TableRow.LayoutParams 提示。修复它(检查编辑问题)。但是,我不确定使用 LinearLayout 会有什么帮助。首先,TableRow 基本上不是水平 LinearLayout 的“薄”扩展吗?另外,如何在 LinearLayout 中实现等宽子视图?
  • 对于线性布局,通过设置 layout_width=0dip 和 layout_weight=1 可以轻松实现等宽子视图。
  • 这与使用 TableLayout 实现的方式相同。并且以编程方式进行操作不适用于 TableLayout - 它可能也不适用于 LinearLayout(除非前者存在错误)
  • 阅读stackoverflow.com/questions/4725024/… 上的 cmets -- 让我试一试并回复您。
  • @SaurabhNanda - Josephus 的技术适用于线性布局但不适用于 TableRow 的原因是 TableRow(如文档所说)特别忽略了 layout_width 和 layout_weight 参数。您可以只放置一个 LinearLayout 来代替 TableRow,它应该以整个表格宽度布置并平均划分其子项。
【解决方案2】:

我认为将项目动态添加到 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));

最后一个参数是重量。

【讨论】:

  • 不是也可以通过XML在每一行中拥有不同数量的项目吗?
  • 当然可以。我只是反对这种设计:) 你试过如果它使用重量有效吗?
  • 我尝试了 width=FILL_PARENT & weight=1,但没有成功。 (我已经编辑了问题以反映这一点)。
  • 稍后将尝试在 ide 中执行代码。现在我正在下载 android sdk。
  • 你试过 layout_width=0dip 吗?看看这个链接androidadvice.blogspot.com/2010/10/…
【解决方案3】:

像这样为包含 ScrollView 的布局设置高度。 它解决了我自己的 tablelayout 不显示最后一行的问题。

android:layout_height="0dp"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多