动态创建 Table 布局,根据屏幕尺寸自动适应单元格。

Dynamic creation of Table layout that auto fits cells according to screen size.

我正在尝试以 3x3 矩阵格式在我的屏幕上显示 9 个图像,以便它完全适合屏幕。 我能够使用 xml 获得所需的结果,但我无法通过代码创建控件来复制相同的结果。 (3 列完全适合我的屏幕,但行没有调整大小以适合屏幕) 请建议我可以通过代码创建动态控件并获得所需结果的方法。

注意:我希望所有内容都以矩阵格式适合我的屏幕,但没有滚动条。 (我无法使用网格布局实现此目的)

这是我的xml:

<TableLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:visibility="gone">
    <TableRow
        android:gravity="center"
        android:layout_weight="1">
        <ImageView
            android:layout_width="1dp"
            android:layout_height="match_parent"
            android:src="@drawable/icon"
            android:layout_weight="1"
            android:layout_gravity="center"/>
        <ImageView
            android:layout_width="1dp"
            android:layout_height="match_parent"
            android:src="@drawable/encrypt"
            android:layout_weight="1"
            android:layout_gravity="center"/>
        <ImageView
            android:layout_width="1dp"
            android:layout_height="match_parent"
            android:src="@drawable/gear"
            android:layout_weight="1"
            android:layout_gravity="center"/>
    </TableRow>
    <TableRow
        android:gravity="center"
        android:layout_weight="1">
    .
    .//Same as row 1
    </TableRow>
    <TableRow
        android:gravity="center"
        android:layout_weight="1">
    .
    .//Same a row 1
    </TableRow>

    </TableLayout>

这会产生矩阵格式的输出,调整单元格大小以适应屏幕。

但是当我通过代码创建控件时无法复制相同的结果。这是我正在使用的代码:

    TableLayout simple_game = new TableLayout(this);
    simple_game.setLayoutParams(new TableLayout.LayoutParams(
    TableLayout.LayoutParams.MATCH_PARENT,
    TableLayout.LayoutParams.MATCH_PARENT));

    for(int i=0;i<3;i++)
    {
        TableRow tr = new TableRow(this);
        simple_game.addView(tr);
        TableLayout.LayoutParams trPara = new TableLayout.LayoutParams();
        trPara.weight = 1f;
        trPara.gravity = Gravity.CENTER;
        tr.setLayoutParams(trPara);

        for(int j=0;j<3;j++)
        {
            ImageView iv = new ImageView(this);
            iv.setImageResource(I[i][j]);
            tr.addView(iv);
            TableRow.LayoutParams trPara2 = new TableRow.LayoutParams();
            trPara2.width = 1;
            trPara2.height = ViewGroup.LayoutParams.MATCH_PARENT;
            trPara2.weight = 1f;
            trPara2.gravity = Gravity.CENTER;
            iv.setLayoutParams(trPara2); 
        }
    }

    setContentView(simple_game);

使用此代码,列会自行调整大小以适应屏幕,但行不会调整大小。

答案是LinearLayout和weight属性。 您可以:

  1. 动态添加 LinearLayout 'horizontal'。
  2. 向水平布局添加 3 个 LinearLayout 'vertical'。
  3. 为每个垂直布局添加 3 张图片。
  4. 将每个垂直布局的权重设置为 1。
  5. 将每张图片的权重设置为1。

注意:在 API 级别 21 或 22 之前,权重不适用于网格布局,因此如果这是您的目标网格布局可能是可行的方法。

This explains creating layouts dynamically.