wake-up-neo.net

Wie bekomme ich ein Android TableLayout, um den Bildschirm auszufüllen?

Ich kämpfe mit dem schrecklichen Layoutsystem von Android. Ich versuche einen Tisch zum Füllen des Bildschirms zu bekommen (einfach richtig?), Aber es ist lächerlich hart.

Ich habe es irgendwie so in XML arbeiten lassen:

<?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>

Ich kann jedoch nicht, dass es in Java funktioniert. Ich habe schon eine Million Kombinationen der LayoutParams ausprobiert, aber nichts funktioniert. Dies ist das beste Ergebnis, das ich habe und nur die Breite des Bildschirms ausfüllt, nicht die Höhe:

    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);
    }

Offensichtlich ist die Android-Dokumentation keine Hilfe. Hat jemand Ideen?

28
Timmmm

Endlich herausgefunden, wie das geht. Geben Sie TableLayout auf und verwenden Sie gerade horizontale LinearLayouts innerhalb einer vertikalen. Der entscheidende Schlüssel ist das Gewicht einzustellen. Wenn Sie FILL_PARENT angeben, aber mit der Standardgewichtung, funktioniert es nicht:

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);
8
Timmmm

In der obigen Diskussion gibt es zwei Fehler.

  1. Es ist möglich, das Gewicht programmatisch festzulegen, indem Sie TableLayout.LayoutParams und TableRow.LayoutParams angeben und den entsprechenden Konstruktor verwenden, z. 

    TableLayout.LayoutParams rowInTableLp = new TableLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT, 1.0f);
    
  2. Ein Widget muss die LayoutParams des übergeordneten Elements haben. Daher müssen die Zeilen TableLayout.LayoutParams verwenden.

Dadurch erhalten Sie die folgende Arbeitsversion Ihres ursprünglichen Codes:

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);

Danke an Romain Guys Kommentar zum Android-Entwicklerforum für die Lösung .

35
Martin

Fand die Antwort: Anscheinend ist es das layout_weight, das funktioniert und es gibt keine Möglichkeit, es von Java aus zu setzen. Verdammt.

Siehe Wie bekomme ich ein Android TableLayout, um das übergeordnete Element im Querformat auszufüllen?

1
Timmmm

Sie legen nie die Zeilen- oder Schaltflächenlayoutparameter fest, während Sie in der veröffentlichten XML-Datei dies tun.

0
Fred Grott

Um TableLayout LayoutParams festzulegen, wird logischerweise die Verwendung der TableLayout.LayoutParams-Klasse erwartet. Es wird jedoch ein Besetzungsfehler angezeigt, der angibt, dass TableLayout.LayoutParams nicht in FrameLayout.LayoutParams umgewandelt werden kann. 

Daher sollten Sie FrameLayout.LayoutParams verwenden, wenn Sie TableLayout-Eigenschaften programmgesteuert festlegen möchten. Zum Beispiel:

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);
0