如何在TableLayout中膨胀单个单元格?

时间:2012-06-18 18:19:27

标签: android android-layout layout-inflater android-tablelayout

我想要膨胀TableLayout的单个单元格:

  • 我想在每个单元格中放入的信息具有固定的大小
  • 我正在使用Adroid 2.2
  • 表格应按以下方式填写:

像这样:

 ___ ___
| 1 | 2 |
|---+---|
| 3 | 4 |
|---+---|
| 5 ...
... and so on

我知道如何对TableLayout的行进行充气,但不知道如何对单个单元格进行充气。它甚至可能吗?解决方法是使用彼此相邻的两个单独的LinearLayouts

此外:

我可以动态更改柱数吗?我的应用程序应仅在两个设备上运行:10.1英寸Galaxy Tab及其模拟器(屏幕较小)。所以在真实设备上我可能应该使用三列。我希望桌子能够填满整个屏幕宽度,而不是粘在左侧。但我不知道如何使用LinearLayout解决方法。

2 个答案:

答案 0 :(得分:0)

希望这就是你所要求的:

  

我想在Android中扩充TableLayout的单个单元格。

假设您的此布局文件包含TableLayout

<TableLayout
        android:id="@+id/tbl"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <TableRow
            android:id="@+id/tableRow1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" >
        </TableRow>

        <TableRow
            android:id="@+id/tableRow2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" >
        </TableRow>

</TableLayout>

现在假设您要添加2个单元格,第一行(第二个位置)中的一个单元格和第一个位置(对角线)上的第二行中的一个单元格。这就是你要做的事情:

    TableLayout tl = (TableLayout) findViewById(R.id.tbl);
    TableRow tr1 = (TableRow) findViewById(R.id.tableRow1);
    TableRow tr2 = (TableRow) findViewById(R.id.tableRow2);
    View cell1 = new View(this); // here you could inflate a layout instead
                                    // of this simple View item
    TableRow.LayoutParams trlp1 = new TableRow.LayoutParams(200, 200);
    trlp1.column = 1; // the column count is 0 based
    cell1.setLayoutParams(trlp1);
    cell1.setBackgroundColor(Color.RED);
    tr1.addView(cell1);

    View cell2 = new View(this);
    TableRow.LayoutParams trlp2 = new TableRow.LayoutParams(200, 200);
    trlp2.column = 0;
    cell2.setLayoutParams(trlp2);
    cell2.setBackgroundColor(Color.GREEN);
    tr2.addView(cell2);
  

我可以动态更改列数吗?

TableLayout中的列数来自具有最大单元格数的行(如果一行有2个单元格而另一行有12个单元格,那么TableLayout包含这两行会有12列)。要增加或减少列数,您只需添加或删除具有最大单元格数的行/行中的单元格。

  

我希望桌子能够填满整个屏幕宽度,而不是粘在上面   左侧

我不明白你想要什么(我希望你的TableLayout设置为FILL_PARENT)。有android:stretchColumns="*"(以及您可以在代码中调用的方法),可使您的列在TableLayout中占用任何额外的可用空间。

答案 1 :(得分:0)

如果其他人有类似的问题,并希望动态地将未知数量的视图加载到现有布局中:

只需使用RelativeLayout,将第一个View添加到您想要的位置,并将其余内容与之前添加的内容对齐。 Android将为每个不适合同一行的视图自动换行,因此您必须先计算或通过“尝试错误”进行计算。

这是一个粗略的例子。首先是填充接口的方法的代码片段:

ArrayList<Item> listItems = item.getItems();
if( listItems != null ) {
    for( Item item: listItem ) {
        addItem( MyActivity.this, item, iCounterItemNumber );
        iCounterItemNumber++;
    }
}

这里是addItem方法:

private void addItem( Activity context, final Item item, int iCounterItemNumber ) {
    View vItem = LayoutInflater.from(context).inflate(R.layout.layoutinflatable_item, null);
    TextView txtvItemName = (TextView) vItem.findViewById(R.id.textView_itemName);

    txtvItemName.setText(item.getName());

    vItem.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View vItem) {
            // just to show that you can set a OnClickListener      
        }
    });

    if ( iCounterItemNumber == 0 ) {
        RelativeLayout.LayoutParams rlpItemParemeters = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
        rlpItemParemeters.addRule(RelativeLayout.ALIGN_PARENT_TOP);
        rlpItemParemeters.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
        vItem.setId( 100 );
        _rlItemTable.addView( vItem, rlpItemParemeters );
    } else if ( iCounterItemNumber % 2 == 0 ) {
        RelativeLayout.LayoutParams rlpPackageParemeters = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
        rlpPackageParemeters.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
        rlpPackageParemeters.addRule(RelativeLayout.BELOW, ( 100 - 2 + iCounterItemNumber ) );
        vPackage.setId( 100 + iCounterItemNumber );
        _rlShopPackagesTable.addView( vPackage, rlpPackageParemeters );
    } else {
        RelativeLayout.LayoutParams rlpPackageParemeters = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
        rlpPackageParemeters.addRule(RelativeLayout.ALIGN_BOTTOM, ( 100 - 1 + iCounterItemNumber ) );
        rlpPackageParemeters.addRule(RelativeLayout.RIGHT_OF, ( 100 - 1 + iCounterItemNumber ) );
        vPackage.setId( 100 + iCounterItemNumber );
        _rlItemTable.addView( vPackage, rlpPackageParemeters );

}

我知道你可以缩短它,但它应该只是一个粗略的例子。希望很清楚我在这里做了什么。不包括不同的屏幕尺寸。使用不同大小的视图,添加或获取屏幕大小,然后使用不同的方法。