Was entspricht "colspan" in einem Android TableLayout?


132

Ich verwende ein TableLayout in Android. Im Moment habe ich eine TableRow mit zwei Elementen und darunter eine TableRow mit einem Element. Es macht so:

-----------------------------
|   Cell 1    |  Cell 2     |
-----------------------------
|   Cell 3    |
---------------

Was ich tun möchte, ist, Cell 3 über beide oberen Zellen zu strecken, also sieht es so aus:

-----------------------------
|   Cell 1    |  Cell 2     |
-----------------------------
|           Cell 3          |
-----------------------------

In HTML würde ich ein COLSPAN verwenden ... wie mache ich das in Android?


Imho, ich finde es besser. Hier die Antwort: stackoverflow.com/a/18682293/1979882
Vyacheslav

1
Beachten Sie für die Aufzeichnung, dass ein TableLayout im Wesentlichen ein LinearLayout ist. Das bedeutet, dass Sie jedes Kind direkt hinzufügen können. Für eine einzelne Ansicht mit allen Spalten können Sie die TableRow überspringen.
Ralfoide

Antworten:


196

Es scheint, dass es dafür ein Attribut gibt: layout_span

UPDATE: Dieses Attribut muss auf die untergeordneten Elemente der TableRow angewendet werden. NICHT zur TableRow selbst.


8
Ja, das ist derjenige. Das Eclipse-Layout-Widget scheint jedoch nichts davon zu wissen, da es nicht unter den verfügbaren Eigenschaften aufgeführt wurde. Aber es funktioniert.
Spike Williams

2
Sie wissen, +1 für Ihr Update in der Antwort. Ich habe versucht herauszufinden, warum Eclipse diese Option bei Strg + Leertaste nicht bietet! : D;)
Nirav Zaveri

Ich benutze layout_span in meiner Ansicht. Dann kann ich in dieser Ansicht kein Gewicht verwenden. Ich muss wrap_content verwenden. Warum?
eC Droid

93

Um die Antwort zu vervollständigen, muss das Attribut layout_span dem untergeordneten Element hinzugefügt werden, nicht TableRow.

Dieses Snippet zeigt die dritte Zeile meines tableLayout, die sich über 2 Spalten erstreckt.

<TableLayout>
    <TableRow
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_span="2"
            android:text="@string/create" />
    </TableRow>
</TableLayout>

36

Und so machen Sie es programmgesteuert

//theChild in this case is the child of TableRow
TableRow.LayoutParams params = (TableRow.LayoutParams) theChild.getLayoutParams();
params.span = 2; //amount of columns you will span
theChild.setLayoutParams(params);

7
Möglicherweise müssen Sie auch params.weight = 1 festlegen, damit der übergreifende Inhalt die Zeile ausfüllt.
Rmirabelle

1
Es funktioniert nicht. stackoverflow.com/a/18682293/1979882 Hier habe ich die Erklärung geschrieben.
Vyacheslav

7
Stellen Sie sicher, dass Sie das untergeordnete Element zuerst zur Zeile hinzufügen.
Artem Kalinchuk

1
@DacSaunders Antwort zurückgesetzt. Ihre Bearbeitung war spezifisch für Ihre Bedürfnisse. Die ursprüngliche Antwort ist generisch für die Methode und 31 Daumen hoch könnten Ihnen sagen, dass Sie vielleicht etwas falsch machen? Siehe auch Artems Kommentar, der hervorhebt, dass das Kind zuerst hinzugefügt werden muss. Das childin diesem Fall kann alles sein, nicht nur Textview als deine Bearbeitung vorgeschlagen. Danke
Onimusha

27

Sie müssen layout_weight verwenden, um die gesamte Zeile zu füllen, da sonst die linke oder rechte Spalte des Tabellenlayouts ausgefüllt wird.

<TableRow
  android:id="@+id/tableRow1"
  android:layout_width="match_parent"
  android:layout_height="wrap_content">

        <Button
            android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_span="2"
            android:layout_weight="1"
            android:text="ClickMe" />

    </TableRow>

3
Danke dir. Dies waren die fehlenden Informationen für kleine oder flexible Elemente, in meinem Fall einen Spinner.
Chksr

5

Vielleicht hilft das jemandem. Ich habe die Lösung mit versucht, layout_spanaber das funktioniert bei mir nicht. Also habe ich das Problem mit diesem Trick gelöst. Verwenden Sie es einfach LinearLayoutanstelle von TableRowColspan, das ist alles.


1
Und es muss kein LinearLayout sein. Ich habe nur eine Ansicht, wie ich wollte.
JPMagalhaes

3

Verwenden Sie android: layout_span im untergeordneten Element des TableRow-Elements


1

Ich hatte ein Problem mit Rowspan, im Fall von TableRow, Textview usw., die mit Code generiert wurden. Auch wenn die Antwort von Onimush gut zu sein scheint, funktioniert sie nicht mit der generierten Benutzeroberfläche.

Hier ist ein Code, der ... nicht funktioniert:

            TableRow the_ligne_unidade = new TableRow(this);
            the_ligne_unidade.setBackgroundColor(the_grey);

            TextView my_unidade = new TextView(this);
            my_unidade.setText(tsap_unidade_nom);
            my_unidade.setTextSize(20);
            my_unidade.setTypeface(null, Typeface.BOLD);
            my_unidade.setVisibility(View.VISIBLE);

            TableRow.LayoutParams the_param;
            the_param = (TableRow.LayoutParams)my_unidade.getLayoutParams();
            the_param.span = 3;
            my_unidade.setLayoutParams(the_param);

            // Put the TextView in the TableRow
            the_ligne_unidade.addView(my_unidade);

Der Code scheint in Ordnung zu sein, aber wenn Sie den Init von "the_params" erreichen, wird NULL zurückgegeben.

Am anderen Ende funktioniert dieser Code wie ein Zauber:

            TableRow the_ligne_unidade = new TableRow(this);
            the_ligne_unidade.setBackgroundColor(the_grey);

            TextView my_unidade = new TextView(this);
            my_unidade.setText(tsap_unidade_nom);
            my_unidade.setTextSize(20);
            my_unidade.setTypeface(null, Typeface.BOLD);
            my_unidade.setVisibility(View.VISIBLE);

            // Put the TextView in the TableRow
            the_ligne_unidade.addView(my_unidade);

            // And now, we change the SPAN
            TableRow.LayoutParams the_param;
            the_param = (TableRow.LayoutParams)my_unidade.getLayoutParams();
            the_param.span = 3;
            my_unidade.setLayoutParams(the_param);

Der einzige Unterschied besteht darin, dass ich die Textansicht in die TableRow schiebe, bevor ich den Bereich einstelle. Und in diesem Fall funktioniert es. Hoffe das hilft jemandem!


0

Ich denke, Sie müssen ein Layout um ein anderes wickeln. Haben Sie eine Layout-Liste vertikal, innerhalb haben Sie eine andere (oder in diesem Fall zwei) Liste horizontal.

Ich finde es immer noch schwierig, die Benutzeroberfläche in Android auf 50-50 Teile aufzuteilen.


Am Ende habe ich dies getan, um einen anderen tabellenbezogenen Fehler zu umgehen, der dazu führte, dass 1/3 meines Layouts aus unbekannten Gründen im Querformat ausgeblendet wurde.
Spike Williams
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.