2010-03-06 8 views
27

Ich habe mit dem schrecklichen Layoutsystem von Android zu kämpfen. Ich versuche, einen Tisch zu bekommen, um den Bildschirm zu füllen (einfach richtig?), Aber es ist lächerlich schwer.Wie bekomme ich ein Android TableLayout, um den Bildschirm zu füllen?

Ich habe es irgendwie wie diese in XML zu arbeiten:

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

Allerdings kann ich es nicht bekommen in Java zu arbeiten. Ich habe eine Million Kombinationen der LayoutParams ausprobiert, aber nichts funktioniert. Dies ist das beste Ergebnis, das ich habe, die 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 ist keine Hilfe. Hat jemand Ideen?

+3

Ich glaube nicht, dass Sie eine Menge Leute bekommen werden, die hetzen, um Ihnen eine Antwort mit all der Negativität in Ihrer Frage zu geben. –

+3

Ja, ich weiß. Es ist einfach frustrierend, wenn man lange mit einer einfachen Aufgabe kämpft. – Timmmm

+5

+1 für den 'verzögerte Layout Android system' –

Antwort

8

Schließlich arbeitete heraus, wie dies zu tun. Hat sich auf TableLayout ausgebreitet und nur horizontale LinearLayouts in einem vertikalen verwendet. Der kritische Schlüssel ist das Gewicht. Wenn Sie FILL_PARENT angeben, aber mit dem Standardgewicht, 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); 
0

Sie geben niemals die Zeilen- oder Schaltflächenlayoutparameter ein, während Sie in der geposteten XML-Datei die Details der for-Schleifen ändern, um sowohl die Zeilenlayoutparameter als auch die Schaltflächenlayoutparameter festzulegen Dein XML.

+0

Es ist nicht - Ich habe versucht, dass (in vielerlei Hinsicht!). Zusätzlich im Android docs heißt es: „Die Kinder eines Tablelayout kann nicht das layout_width Attribut angeben Breite ist immer fill_parent jedoch das layout_height Attribut kann von einem Kind definiert werden; Standardwert WRAP_CONTENT ist, wenn das Kind ein TableRow ist... , dann ist die Höhe immer WRAP_CONTENT. " Und "Die untergeordneten Elemente einer TableRow müssen die Attribute layout_width und layout_height in der XML-Datei nicht angeben. TableRow erzwingt diese Werte immer als FILL_PARENT und WRAP_CONTENT." – Timmmm

34

Es gibt 2 Fehler in der obigen Diskussion.

  1. Es ist möglich, das Gewicht programmatisch zu setzen, indem TableLayout.LayoutParams und TableRow.LayoutParams und unter Verwendung der entsprechenden Konstruktionsangaben sind z.B.

    TableLayout.LayoutParams rowInTableLp = neue TableLayout.LayoutParams (LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT, 1.0f);

  2. Ein Widget muss über die LayoutParams des übergeordneten Elements verfügen. Daher müssen die Reihen TableLayout.LayoutParams verwenden

Dies gibt Ihnen die folgenden Arbeitsversion Ihres ursprünglichen Code:

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

Dank Romain Guy Kommentar im Forum Android-Entwickler für the solution.

+0

Whooah, wurde mit anderen Beispielen für Alter zu kämpfen! Endlich funktioniert das! Thaaanks! – bk138

+2

Dieser Satz hat den Trick für mich: ‚Ein Widget muss die LayoutParams ihrer Eltern haben. Daher verwenden die Zeilen müssen TableLayout.LayoutParams' – hhh3112

+1

Ich habe auf diese verbrachte Stunden, bis ich diese Zeilen lesen ... ** ‚Ein Widget die LayoutParams ihrer Eltern haben.‘ ** Dank gespeichert Sie mich viel Zeit ! – Bojan

0

Zum Festlegen von TableLayout LayoutParams wird logisch die Verwendung der TableLayout.LayoutParams-Klasse erwartet, aber Sie erhalten einen Umwandlungsfehler, der besagt, dass TableLayout.LayoutParams nicht in FrameLayout.LayoutParams gegossen werden kann.

Sie sollten also 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);