it-swarm.dev

Jak mohu dostat Android TableLayout k vyplnění obrazovky?

Já jsem bojoval s Android je hrozný layout systém. Snažím se dostat stůl, aby vyplnil obrazovku (jednoduché?), Ale je to směšně těžké.

Takhle to fungovalo v 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>

Nemohu se však dostat do práce v Javě. Zkoušel jsem milion kombinací LayoutParams, ale nic nefunguje. To je nejlepší výsledek, který mám, jen vyplní šířku obrazovky, ne výšku:

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

Je zřejmé, že Android dokumentace není pomoc. Každý má nějaké nápady?

28
Timmmm

Nakonec jsem se snažil, jak to udělat. Vzrostl na TableLayout a ve vodorovné rovině jste použili pouze vodorovné LinearLayouts. Klíčovým klíčem je nastavení váhy. Pokud zadáte FILL_PARENT, ale s výchozí váhou, nebude fungovat:

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

Ve výše uvedené diskusi jsou dvě chyby.

  1. Váhu lze programově nastavit zadáním TableLayout.LayoutParams a TableRow.LayoutParams a použitím vhodného konstruktoru, např. 

    TableLayout.LayoutParams rowInTableLp = new TableLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT, 1.0f);
    
  2. Widget musí mít LayoutParams svého rodiče. Proto musí řádky používat TableLayout.LayoutParams.

Tím získáte následující pracovní verzi počátečního kódu:

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

Díky komentáři Romaina Guyho na fóru vývojáře Androidu pro the solution .

35
Martin

Odpověď: Zdá se, že je to layout_weight, která dělá to funguje a neexistuje žádný způsob, jak ji nastavit z Javy. Sakra.

Viz Jak mohu získat Android TableLayout k vyplnění rodiče v režimu na šířku?

1
Timmmm

Nikdy neupravujete parametry rozvržení řádků nebo tlačítek, zatímco ve zveřejněném xml to uděláte ... změňte podrobnosti o smyčkách pro nastavování parametrů rozložení řádků a parametrů rozložení tlačítek, než by měl mít stejný výsledek jako váš XML.

0
Fred Grott

Chcete-li nastavit TableLayout LayoutParams, logicky očekáváme použití třídy TableLayout.LayoutParams, ale obdržíte chybu obsazení, která uvádí, že TableLayout.LayoutParams nelze vložit do FrameLayout.LayoutParams. 

Pokud chcete programově nastavit vlastnosti TableLayout, měli byste použít FrameLayout.LayoutParams. Například:

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
Mohammed Mukhtar