Quel est l'équivalent de «colspan» dans un TableLayout Android?

132

J'utilise un TableLayout dans Android. À l'heure actuelle, j'ai un TableRow avec deux éléments, et, en dessous, un TableRow avec un élément. Il rend comme ceci:

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

Ce que je veux faire, c'est étirer la cellule 3 sur les deux cellules supérieures, donc cela ressemble à ceci:

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

En HTML, j'utiliserais un COLSPAN .... comment faire fonctionner cela sous Android?

Spike Williams
la source
Imho, je trouve une meilleure façon de faire cela. Voici la réponse: stackoverflow.com/a/18682293/1979882
Vyacheslav
1
Pour mémoire, notez qu'un TableLayout est essentiellement un LinearLayout. Cela signifie que vous pouvez ajouter n'importe quel enfant directement. Ainsi, pour une vue unique sur toute l'étendue des colonnes, vous pouvez ignorer le TableRow.
ralfoide

Réponses:

196

Il semble qu'il y ait un attribut faisant cela: layout_span

UPDATE: cet attribut doit être appliqué aux enfants du TableRow. PAS au TableRow lui-même.

Sephy
la source
8
Ouais, c'est celui-là. Cependant, le widget de mise en page Eclipse ne semble pas le savoir, car il ne figure pas parmi les propriétés disponibles. Mais, il fonctionne.
Spike Williams
2
Vous savez, +1 pour votre mise à jour dans la réponse. J'essayais de savoir pourquoi Eclipse ne donne pas cette option sur Ctrl + Espace! : D;)
Nirav Zaveri
J'utilise layout_span sur ma vue. Ensuite, je ne peux pas utiliser de poids sur cette vue. Je dois utiliser wrap_content. Pourquoi?
eC Droid
93

Juste pour compléter la réponse, l'attribut layout_span doit être ajouté à l'enfant, pas à TableRow.

Cet extrait montre la troisième ligne de mon tableLayout, qui s'étend sur 2 colonnes.

<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>
Maragues
la source
36

Et voici comment vous procédez par programmation

//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);
Onimusha
la source
7
Vous devrez peut-être également définir params.weight = 1 pour que le contenu fractionné remplisse la ligne.
rmirabelle
1
Ça ne marche pas. stackoverflow.com/a/18682293/1979882 Ici, j'ai écrit l'explication.
Vyacheslav
7
Assurez-vous d'ajouter d'abord l'enfant à la ligne.
Artem Kalinchuk
1
Réponse de @DacSaunders annulée. Votre modification était spécifique à votre besoin. La réponse originale est générique pour la méthode et 31 pouces vers le haut pourraient vous dire peut-être que vous faites quelque chose de mal? Voir également le commentaire d'Artem qui souligne que l'enfant doit d'abord être ajouté. Dans childce cas, il peut s'agir de n'importe quoi, pas seulement de la vue de texte comme votre modification l'a suggéré. Merci
Onimusha
27

Vous devez utiliser layout_weight pour remplir la ligne entière, sinon elle remplit toujours la colonne gauche ou droite de la mise en page du tableau.

<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>
Raghavendra
la source
3
Je vous remercie. Ce sont les informations manquantes pour les éléments petits ou flexibles, dans mon cas un Spinner.
chksr
5

Peut-être que cela aidera quelqu'un. J'ai essayé la solution avec layout_spanmais cela ne fonctionne pas pour moi. J'ai donc résolu le problème avec cette astuce. Utilisez simplement LinearLayoutà la place de l'endroit TableRowoù vous avez besoin de colspan, c'est tout.

Dimanoïde
la source
1
Et il n'est pas nécessaire que ce soit un LinearLayout. Je mets juste une vue, comme je le voulais.
JPMagalhaes
3

utiliser android: layout_span dans l'élément enfant de l'élément TableRow

Mosiur
la source
1

J'ai eu un problème avec rowspan, dans le cas de TableRow, Textview, etc., généré avec du code. Même si la réponse d'Onimush semble bonne, elle ne fonctionne pas avec l'interface utilisateur générée.

Voici un morceau de code qui ... ne fonctionne pas:

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

Le code semble être correct mais, lorsque vous atteignez le début de "the_params", il renvoie NULL.

À l'autre bout, ce code fonctionne comme un charme:

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

La seule différence est que je pousse le Textview à l'intérieur du TableRow avant de définir la durée. Et dans ce cas, cela fonctionne. J'espère que cela aidera quelqu'un!

Peter
la source
0

Je pense que vous devez envelopper une mise en page autour d'une autre. Avoir une liste de mise en page verticalement, à l'intérieur une autre liste (ou dans ce cas, deux) horizontalement.

J'ai toujours du mal à diviser correctement l'interface en une partie 50-50 dans Android.

RobGThai
la source
J'ai fini par faire cela pour contourner un autre bogue lié à la table qui provoquait le masquage d'un tiers de ma mise en page en mode paysage, pour des raisons inconnues.
Spike Williams