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?


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.


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>

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

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>

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.


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


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!


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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.