2010-04-26 15 views
121

Sto usando un TableLayout in Android. In questo momento ho un TableRow con due elementi al suo interno e, al di sotto di questo, un TableRow con un elemento. Si rende così:Qual è l'equivalente di "colspan" in un TableLayout Android?

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

Quello che voglio fare è fare cellulare 3 tratto in entrambe le cellule superiori, in modo che appaia simile al seguente:

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

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

+0

Imho, ho trovato il modo migliore per farlo. Ecco la risposta: http://stackoverflow.com/a/18682293/1979882 – Vyacheslav

+1

Per la cronaca, si noti che un TableLayout è essenzialmente un LinearLayout. Ciò significa che puoi aggiungere qualsiasi bambino direttamente. Pertanto, per una singola visualizzazione di tutte le colonne, è possibile saltare il TableRow. – ralfoide

risposta

175

Sembra che ci sia un attributo farlo: layout_span

UPDATE: Questo attributo deve essere applicato ai bambini della TableRow. NON al TableRow stesso.

+8

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

+2

Sai, +1 per il tuo aggiornamento nella risposta. Stavo cercando di scoprire perché Eclipse non offre questa opzione su Ctrl + Spazio! : D;) –

+0

Io uso layout_span sulla mia vista. Quindi non posso usare il peso su quella vista. Devo usare wrap_content. Perché? –

0

Penso che sia necessario avvolgere un layout attorno a un altro. Ha una lista di layout in verticale, all'interno ne ha un'altra (o in questo caso due) in ordine orizzontale.

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

+0

Ho finito per fare questo per aggirare un altro bug relativo alla tabella che stava causando l'occultamento di 1/3 del mio layout in modalità orizzontale, per ragioni sconosciute. –

82

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

Questo snippet 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> 
31

e questo è come si fa a livello di codice

//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); 
+6

Potrebbe anche essere necessario impostare params.weight = 1 per fare in modo che il contenuto con spanning riempia la riga. – rmirabelle

+1

Non funziona. http://stackoverflow.com/a/18682293/1979882 Qui ho scritto la spiegazione. – Vyacheslav

+6

Assicurarsi di aggiungere prima il figlio alla riga. –

5

Forse questo aiuterà qualcuno. Ho provato la soluzione con layout_span ma questo non funziona per me. Quindi ho risolto il problema con questo trucco. Basta usare LinearLayout al posto di TableRow dove hai bisogno di colspan, questo è tutto.

+1

E non è necessario essere un LinearLayout. Ho solo una visione, come volevo. – JPMagalhaes

3

utilizzare Android: layout_span in elemento figlio di TableRow elemento

23

Devi usare layout_weight per riempire l'intera riga altrimenti si riempie ancora colonna di sinistra o di destra del layout di 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

1

Ho avuto qualche problema con la rowspan, in 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 funzionano:

  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 l'init di "the_params" restituisce NULL.

Dall'altra parte, questo codice funziona come un fascino:

  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 il TextView all'interno del TableRow prima di impostare l'intervallo. E in questo caso, funziona. Spero che questo aiuti qualcuno!

+0

WOW! questo funziona davvero! Grazie per avermi salvato ore di ricodifica: D –

Problemi correlati