Qual è l'equivalente di "colspan" in un TableLayout Android?


132

Sto usando un TableLayout in Android. In questo momento ho un TableRow con due elementi al suo interno e, al di sotto, un TableRow con un oggetto. Il rendering in questo modo:

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

Quello che voglio fare è allungare Cell 3 su entrambe le cellule superiori, quindi sembra che:

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

In HTML userei un COLSPAN .... come posso farlo funzionare su Android?


Imho, trovo il modo migliore per farlo. Ecco la risposta: stackoverflow.com/a/18682293/1979882
Vyacheslav

1
Per la cronaca, si noti che un TableLayout è essenzialmente un LinearLayout. Ciò significa che puoi aggiungere direttamente qualsiasi bambino. Pertanto, per una singola visualizzazione a colonna intera, è possibile saltare TableRow.
ralfoide,

Risposte:


196

Sembra che ci sia un attributo che lo fa: layout_span

AGGIORNAMENTO: questo attributo deve essere applicato ai figli di TableRow. NON alla tabella stessa.


8
Sì, questo è quello. Il widget di layout di Eclipse non sembra conoscerlo, tuttavia, poiché non era elencato tra le proprietà disponibili. Ma funziona.
Spike Williams,

2
Sai, +1 per l'aggiornamento nella risposta. Stavo cercando di scoprire perché Eclipse non offre questa opzione su Ctrl + Spazio! : D;)
Nirav Zaveri,

Uso layout_span a mio avviso. Quindi non posso usare il peso su quella vista. Devo usare wrap_content. Perché?
eC Droid,

93

Solo per completare la risposta, l'attributo layout_span deve essere aggiunto al figlio, non a TableRow.

Questo frammento mostra la terza riga del mio tableLayout, che si estende per 2 colonne.

<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

Ed è così che lo fai programmaticamente

//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
Potrebbe anche essere necessario impostare params.weight = 1 per fare in modo che il contenuto con spanning riempia la riga.
rmirabelle,

1
Non funziona stackoverflow.com/a/18682293/1979882 Qui ho scritto la spiegazione.
Vyacheslav,

7
Assicurati di aggiungere prima il figlio alla riga.
Artem Kalinchuk,

1
@DacSaunders Risposta ripristinata. La tua modifica era specifica per le tue necessità. La risposta originale è generica per il metodo e 31 pollici in su potrebbero dirti forse stai sbagliando qualcosa? Vedi anche il commento di Artem che evidenzia che il bambino deve essere aggiunto per primo. In childquesto caso può essere qualsiasi cosa, non solo la visualizzazione di testo come suggerito dalla modifica. Grazie
Onimusha,

27

Devi usare layout_weight per riempire l'intera riga altrimenti riempie ancora la colonna sinistra o destra del layout della tabella.

<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
Grazie. Questa era l'informazione mancante per elementi piccoli o flessibili, nel mio caso uno Spinner.
Chksr

5

Forse questo aiuterà qualcuno. Ho provato la soluzione con layout_spanma questo non funziona per me. Quindi ho risolto il problema con questo trucco. Basta usare LinearLayoutal posto di TableRowdove hai bisogno di colspan, tutto qui.


1
E non deve essere un LinearLayout. Ho messo solo una vista, come volevo.
JP Magalhaes,

3

usa android: layout_span nell'elemento figlio dell'elemento TableRow


1

Ho avuto qualche problema con il file di righe, nel caso di TableRow, Textview e così via, generato con il codice. Anche se la risposta di Onimush sembra essere buona, non funziona con l'interfaccia utente generata.

Ecco un pezzo di codice che .... non funziona:

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

Il codice sembra essere OK ma, quando si raggiunge init di "the_params", restituisce NULL.

Dall'altro lato, questo codice funziona come un incantesimo:

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

L'unica differenza è che spingo la vista di testo all'interno di TableRow prima di impostare l'intervallo. E in questo caso, funziona. Spero che questo possa aiutare qualcuno!


0

Penso che tu debba avvolgere un layout attorno a un altro. Avere un elenco di layout in verticale, all'interno di un altro (o in questo caso, due) elenco in orizzontale.

Sto ancora trovando difficile dividere l'interfaccia in 50-50 parti su Android.


Ho finito per farlo per aggirare un diverso bug relativo alla tabella che causava la nascondere 1/3 del mio layout in modalità orizzontale, per motivi sconosciuti.
Spike Williams,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.