2

我非常接近于选择一个 LinearLayout 替代方案,但是如果没有做到这一点会让人很恼火。为了获得最大的灵活性,我定义了一个 TableLayout xml,只定义了一个行标题。接下来,我生成了一个单独的 TableRow xml,定义了“行模板”。在 Javacode 中,我对 TableRow 进行了子类化,在构造函数中,我膨胀了 tablerow 模板以附加到根(子类)。

嗯,到目前为止还不错。当表格被填充时,标题行是好的,但其他行不是。似乎它们以不同的方式布局,两列没有按预期填充整个宽度,因此这些列没有正确对齐。

任何人都可以阐明这一点?我已经尝试了很多解决方案,但没有任何办法使它起作用。

带有标题行的表格布局

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/scrollView1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fillViewport="true" >

    <HorizontalScrollView
        android:id="@+id/horizontalScrollView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:fillViewport="true" >

        <TableLayout
            android:id="@+id/zone_table"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:stretchColumns="*" >

            <TableRow
                android:id="@+id/tableRow1"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_gravity="fill_horizontal"
                android:clipToPadding="false" >

                <TextView
                    android:layout_width="0dip"
                    android:layout_weight="0.8"
                    android:background="#ffcccccc"
                    android:text="Zonename"
                    android:textColor="@android:color/black" />

                <TextView
                    android:layout_width="0dip"
                    android:layout_weight="0.2"
                    android:background="#ffcccc00"
                    android:gravity="right"
                    android:text="Antall"
                    android:textColor="@android:color/black" />
            </TableRow>
        </TableLayout>
    </HorizontalScrollView>

</ScrollView>

“其他”膨胀的行

    <TableRow xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/zonetablerow"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
>

    <TextView
        android:id="@+id/zonerow_name"
        android:layout_width="0dip"
        android:layout_weight="0.8"
        android:background="#ffcccccc"
        android:textSize="18dp" />

    <TextView
        android:id="@+id/zonerow_invcount"
        android:layout_width="0dip"
        android:layout_gravity="right"
        android:layout_weight="0.2"
        android:background="#ffcccc00"
        android:textSize="18dp" />

</TableRow>

扩展 TableRow 的类

    public class ZoneRow extends TableRow {
    private ZoneInventoryDAO dao = null;
    private int inventoryCount = 0;

    public ZoneRow(Context ctx, ZoneInventoryDAO dao) {
        this(ctx, dao, 0);
    }

    public ZoneRow(Context ctx, ZoneInventoryDAO dao, int inventoryCount) {
        super(ctx);
        setWeightSum(1.0f);
        this.dao = dao;
        this.inventoryCount = inventoryCount;
        doLayout();
    }

    private void doLayout() {
        // XML layouten settes med zonerow som parent (se:
        // http://developer.android.com/resources/articles/layout-tricks-merge.html)
        View v = LayoutInflater.from(getContext()).inflate(R.layout.zonerow,
                this, true);
        TextView t = (TextView) findViewById(R.id.zonerow_name);
        TextView cnt = (TextView) findViewById(R.id.zonerow_invcount);

        t.setText(dao.getZoneAlias());
        cnt.setText(String.valueOf(inventoryCount));

    }

    public void incInventory() {
        inventoryCount++;
    }

    public ZoneInventoryDAO getDAO() {
        return dao;
    }

}
4

3 回答 3

0

我有同样的问题。我通过不这样做来修复它 - 特别是通过不继承 TableRow,而只是在代码中实例化它们并手动应用我需要的任何东西。您可以通过封装来做到这一点。有一些记录有 ZoneInventoryDAO、inventoryCount 和 tableRow,它们指向对应的 TableRow 实例。只需用通货膨胀实例化 TableRow:

TableLayout table = (TableLayout) inflater.inflate(R.layout.my_table, null); // etc
...
for (//each data item//) {
  TableRow tr = (TableRow) inflater.inflate(R.layout.my_table_row, null);
  TextView tv1 = (TextView) findViewById(R.id.table_entry_1);
  tv1.setText("Whatever goes here");
  ...
  // and so on for each column
  table.addView(tr);
}

当将相同的代码移动到扩展 TableRow 的类中时,上述方法对我有用。

于 2013-05-01T23:15:21.520 回答
0

看起来您正在扩展 tablerow 并创建该对象的实例。这将导致创建一个表行。然后你正在膨胀另一个 tablerow,它出于某种原因与第一个交互。要快速修复,请尝试添加类似 table.setColumnStretchable(0, true);

于 2012-04-19T16:23:02.380 回答
0

我知道这是旧的,但我有同样的问题,并想通了,所以也许这会帮助未来的用户。

问题是,当您从 XML 扩展 TableRow 并将其添加到扩展的 TableRow 中时,Table 将其视为具有多个子项的单列,因为您的布局中的 TableRow 本质上是一个 ViewGroup。因此,它将表格布置为单列表格。

解决方案是在 TableRow XML 布局中,使用<merge>类型,而不是<TableRow>类型。这样,当膨胀时,您的 xml 中的项目将被合并到您的扩展 TableRow 中,并且您的扩展 TableRow 将有多个列。

这是示例代码

<merge xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/zonetablerow"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
>

    <TextView
        android:id="@+id/zonerow_name"
        android:layout_width="0dip"
        android:layout_weight="0.8"
        android:background="#ffcccccc"
        android:textSize="18dp" />

    <TextView
        android:id="@+id/zonerow_invcount"
        android:layout_width="0dip"
        android:layout_gravity="right"
        android:layout_weight="0.2"
        android:background="#ffcccc00"
        android:textSize="18dp" />

</merge>
于 2016-04-08T17:24:13.270 回答