如何让 Android TableLayout 填满屏幕?
我正在与 Android 糟糕的布局系统作斗争。我试图让一张桌子填满屏幕(很简单吧?),但这非常困难。
我让它在 XML 中以某种方式工作,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="fill_parent" android:layout_width="fill_parent">
<TableRow android:layout_height="fill_parent" android:layout_width="fill_parent" android:layout_weight="1">
<Button android:text="A" android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_weight="1"/>
<Button android:text="B" android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_weight="1"/>
</TableRow>
<TableRow android:layout_height="fill_parent" android:layout_width="fill_parent" android:layout_weight="1">
<Button android:text="C" android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_weight="1"/>
<Button android:text="D" android:layout_width="wrap_content" android:layout_height="fill_parent" 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 文档没有帮助。有人有什么想法吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
上述讨论有两个错误。
可以通过指定
TableLayout.LayoutParams
和TableRow.LayoutParams
并使用适当的构造函数以编程方式设置权重,例如A小部件必须具有其父级的 LayoutParams 。因此,行必须使用
TableLayout.LayoutParams
。这将为您提供以下初始代码的工作版本:
感谢 Romain Guy 在 Android 开发者论坛上针对 解决方案。
There are two mistakes in the above discussion.
It is possible to programatically set the weight by specifying
TableLayout.LayoutParams
andTableRow.LayoutParams
and using the appropriate constructor, e.g.A widget must have the
LayoutParams
of its parent. Therefore, the rows must useTableLayout.LayoutParams
.This gives you the following working version of your initial code:
Thanks to Romain Guy's comment on Android developer's forum for the solution.
终于弄清楚如何做到这一点。放弃了
TableLayout
,只在垂直布局中使用水平LinearLayout
。关键是权重的设定。如果您指定FILL_PARENT
但使用默认权重,则它不起作用:Finally worked out how to do this. Gave up on
TableLayout
and just used horizontalLinearLayout
s inside a vertical one. The critical key is to set the weight. If you specifyFILL_PARENT
but with the default weight, it doesn't work:找到答案:显然是layout_weight使它起作用,并且没有办法从Java中设置它。该死的。
请参阅我该如何获取 Android TableLayout 以在横向模式下填充父级?
Found the answer: apparently it is the layout_weight that makes it work and there is no way to set it from Java. Damnit.
See How can I get an Android TableLayout to fill the parent in landscape mode?
您永远不会设置行或按钮布局参数,而在发布的 xml 中您会这样做..更改 for 循环的详细信息以设置行布局参数和按钮布局参数,而不是它应该给出与您的 xml 相同的结果。
You never set the row or button layout parameters whereas in the posted xml you do that..change the details of the for loops to set both the row layout parameters and the button layout parameters than it should give the same result as your xml.
要设置 TableLayout LayoutParams,我们逻辑上期望使用 TableLayout.LayoutParams 类,但您会收到一个转换错误,指出 TableLayout.LayoutParams 无法转换为 FrameLayout.LayoutParams。
因此,如果您想以编程方式设置 TableLayout 属性,则应该使用 FrameLayout.LayoutParams。例如:
To set TableLayout LayoutParams, we logically expect to use TableLayout.LayoutParams class, but you will get a cast error stating that TableLayout.LayoutParams cannot be casted into FrameLayout.LayoutParams.
So, you should use FrameLayout.LayoutParams, if you want to programmatically set TableLayout properties. For example: