如何让 Android TableLayout 填满屏幕?

Posted

技术标签:

【中文标题】如何让 Android TableLayout 填满屏幕?【英文标题】:How can I get an Android TableLayout to fill the screen? 【发布时间】:2011-01-24 12:43:48 【问题描述】:

我正在与 android 糟糕的布局系统作斗争。我试图让一张桌子填满屏幕(很简单吧?)但这太难了。

我让它以某种方式在 XML 中工作,如下所示:

<?xml version="1.0" encoding="utf-8"?>

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_ android:layout_>
<TableRow android:layout_ android:layout_ android:layout_weight="1">
<Button android:text="A" android:layout_ android:layout_ android:layout_weight="1"/>
<Button android:text="B" android:layout_ android:layout_ android:layout_weight="1"/>
</TableRow>
<TableRow android:layout_ android:layout_ android:layout_weight="1">
<Button android:text="C" android:layout_ android:layout_ android:layout_weight="1"/>
<Button android:text="D" android:layout_ android:layout_ android:layout_weight="1"/>
</TableRow>

但是我无法让它在 Java 中工作。我已经尝试了 LayoutParams 的一百万种组合,但没有任何效果。这是我最好的结果,它只填充了屏幕的宽度,而不是高度:

    table = new TableLayout(this);
    // Java. You suck.
    TableLayout.LayoutParams lp = new TableLayout.LayoutParams(
                                    ViewGroup.LayoutParams.FILL_PARENT,
                                    ViewGroup.LayoutParams.FILL_PARENT);
    table.setLayoutParams(lp); // This line has no effect! WHYYYY?!
    table.setStretchAllColumns(true);
    for (int r = 0; r < 2; ++r)
    
        TableRow row = new TableRow(this);
        for (int c = 0; c < 2; ++c)
        
            Button btn = new Button(this);
            btn.setText("A");
            row.addView(btn);
        
        table.addView(row);
    

显然,Android 文档没有帮助。有人有什么想法吗?

【问题讨论】:

我认为您不会让很多人急于为您提供答案,因为您的问题中包含所有消极因素。 是的,我知道。当您为一项本应简单的任务奋斗了很久时,这真是令人沮丧。 Android's retarded layout system+1 【参考方案1】:

上面的讨论有两个错误。

    可以通过指定TableLayout.LayoutParamsTableRow.LayoutParams 并使用适当的构造函数以编程方式设置权重,例如

    TableLayout.LayoutParams rowInTableLp = new TableLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT, 1.0f);
    

    小部件必须具有其父级的LayoutParams。因此,行必须使用TableLayout.LayoutParams

这为您提供了初始代码的以下工作版本:

TableLayout table = new TableLayout(this);
// Java. You succeed!
FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(
        ViewGroup.LayoutParams.FILL_PARENT,
        ViewGroup.LayoutParams.FILL_PARENT);
table.setLayoutParams(lp);
table.setStretchAllColumns(true);

TableLayout.LayoutParams rowLp = new TableLayout.LayoutParams(
        ViewGroup.LayoutParams.FILL_PARENT,
        ViewGroup.LayoutParams.FILL_PARENT,
        1.0f);
TableRow.LayoutParams cellLp = new TableRow.LayoutParams(
        ViewGroup.LayoutParams.FILL_PARENT,
        ViewGroup.LayoutParams.FILL_PARENT,
        1.0f);
for (int r = 0; r < 2; ++r)

    TableRow row = new TableRow(this);
    for (int c = 0; c < 2; ++c)
    
        Button btn = new Button(this);
        btn.setText("A");
        row.addView(btn, cellLp);
    
    table.addView(row, rowLp);

setContentView(table);

感谢 Romain Guy 在 Android 开发者论坛上对the solution 的评论。

【讨论】:

哇哦,多年来一直在与其他示例作斗争!最后这个工作!太棒了! 这句话对我有用:'一个小部件必须具有其父级的 LayoutParams。因此,行必须使用 TableLayout.LayoutParams' 我已经花了好几个小时才读到这篇文章... “小部件必须具有其父级的 LayoutParams。” 谢谢你为我节省了很多时间! 【参考方案2】:

终于想出了如何做到这一点。放弃TableLayout,只在垂直方向使用水平LinearLayouts。关键是设置权重。如果你指定FILL_PARENT但使用默认权重,它不起作用:

LinearLayout buttonsView = new LinearLayout(this);
buttonsView.setOrientation(LinearLayout.VERTICAL);
for (int r = 0; r < 6; ++r)

    LinearLayout row = new LinearLayout(this);
    row.setOrientation(LinearLayout.HORIZONTAL);
    for (int c = 0; c < 4; ++c)
    
        Button btn = new Button(this);
        btn.setText("A");
        LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT);
        lp.weight = 1.0f;
        row.addView(btn, lp);
    
    LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT);
    lp.weight = 1.0f;
    buttonsView.addView(row, lp);
  

ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT);
setContentView(buttonsView, lp);

【讨论】:

【参考方案3】:

找到了答案:显然是 layout_weight 使它工作并且没有办法从 Java 中设置它。该死的。

见How can I get an Android TableLayout to fill the parent in landscape mode?

【讨论】:

【参考方案4】:

您永远不会设置行或按钮布局参数,而在发布的 xml 中您会这样做..更改 for 循环的详细信息以设置行布局参数和按钮布局参数,而不是它应该给出与您相同的结果xml。

【讨论】:

它没有 - 我试过了(在很多方面!)。此外,在 Android 文档中,它说:“TableLayout 的子级不能指定 layout_width 属性。宽度始终为 FILL_PARENT。但是,layout_height 属性可以由子级定义;默认值为 WRAP_CONTENT。如果子级是 TableRow,则高度始终为 WRAP_CONTENT。”并且“TableRow 的子项不需要在 XML 文件中指定 layout_width 和 layout_height 属性。TableRow 始终强制这些值分别为 FILL_PARENT 和 WRAP_CONTENT。”【参考方案5】:

要设置 TableLayout LayoutParams,我们逻辑上希望使用 TableLayout.LayoutParams 类,但是您会收到一个转换错误,指出 TableLayout.LayoutParams 无法转换为 FrameLayout.LayoutParams。

因此,如果您想以编程方式设置 TableLayout 属性,则应该使用 FrameLayout.LayoutParams。例如:

FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(TableLayout.LayoutParams.MATCH_PARENT,TableLayout.LayoutParams.MATCH_PARENT);
            layoutParams.setMargins(80, 0, 0, 0);
            TableLayout tableLayout = (TableLayout) findViewById(R.id.header_detail);
            tableLayout.setLayoutParams(layoutParams);

【讨论】:

以上是关于如何让 Android TableLayout 填满屏幕?的主要内容,如果未能解决你的问题,请参考以下文章

一起Talk Android吧(第四百零一回:如何使用TableLayout布局)

Android:如何在 TableLayout 中滑动列?

Android零基础入门第29节:善用TableLayout表格布局,事半功倍

Android零基础入门第29节:善用TableLayout表格布局,事半功倍

android的:tableLayout和gridview有啥不同

如何在 Android 的 TableLayout 中设置表格宽度和列数