如何让 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.LayoutParams
和TableRow.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
,只在垂直方向使用水平LinearLayout
s。关键是设置权重。如果你指定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零基础入门第29节:善用TableLayout表格布局,事半功倍
Android零基础入门第29节:善用TableLayout表格布局,事半功倍