I'm battling with Android's awful layout system. I'm trying to get a table to fill the screen (simple right?) but it's ridiculously hard.
I got it to work somehow in XML like this:
<?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>
However I can not get it to work in Java. I've tried a million combinations of the LayoutParams, but nothing ever works. This is the best result I have which only fills the width of the screen, not the height:
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);
}
Obviously the Android documentation is no help. Anyone have any ideas?
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?
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.
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.
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: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: