Autore Topic: Disegnare il layout - tutto via programma.  (Letto 659 volte)

Offline ceklo

  • Nuovo arrivato
  • *
  • Post: 45
  • Respect: +1
    • Mostra profilo
Disegnare il layout - tutto via programma.
« il: 23 Giugno 2013, 18:17:29 CEST »
0
Ciao a tutti,

Desidero creare una tabella definendo ogni cosa programmaticamente sul layout.

Sono riuscito con il seguente codice a creare una tabella dove le intestazioni sono collegate solidalmente al corpo, e quindi cuando "scorro" in alto "scompaiono" le intestazioni. In questo modo si perde un pò il significato di ogni campo.

Codice: [Seleziona]
@Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.layoutXX);
               
                HorizontalScrollView HSC = new HorizontalScrollView(this);
                ScrollView VSC = new ScrollView(this);
                TableLayout tableLayout = new TableLayout(this);
                tableLayout.setGravity(Gravity.CENTER);
                TextView[] values = new TextView[20];

                //Intestazione della tabella.
                TableRow primaRiga = new TableRow(this);
                primaRiga.setGravity(Gravity.CENTER);
                String intestTabMySQL[] = getResources().getStringArray(R.array.intestazione_tabella_MySQL);
                int[] larghezza_campi_MySQL = getResources().getIntArray(R.array.larghezza_campi_MySQL);
                for (int i = 0; i < 20 ; i++) {
                        values[i] = new TextView(this);
                        values[i].setText(intestTabMySQL[i]);
                        values[i].setMinimumWidth(larghezza_campi_MySQL[i]);
                        values[i].setPadding(10, 10, 10, 10);
                        values[i].setEnabled(false);
                        values[i].setBackgroundDrawable(getResources().getDrawable(R.drawable.back04));
                        values[i].setTextColor(getResources().getColor(R.color.blue));
                        primaRiga.addView(values[i]);
                }
                tableLayout.addView(primaRiga);
               
                //Corpo della tabella.
                for (int j = 0; j < 100; j++) {
                        TableRow tableRow = new TableRow(this);
                        tableRow.setGravity(Gravity.CENTER);
                        for (int k = 0; k < 20 ; k++) {
                                values[k] = new TextView(this);
                                values[k].setText(" R" + (j+1) + "C" + (k+1) + " ");
                                values[k].setPadding(10, 10, 10, 10);
                                values[k].setEnabled(false);
                                values[k].setBackgroundDrawable(getResources().getDrawable(R.drawable.back03));
                                values[k].setTextColor(getResources().getColor(R.color.blue));
                                tableRow.addView(values[k]);
                        }
                        tableLayout.addView(tableRow);
                }
                VSC.addView(tableLayout);
                HSC.addView(VSC);
                setContentView(HSC);
        }

Fin qui, tutte le rows sono state aggiunte allo stesso tableLayout, contenuto a sua volta, dalle barre di scorrimento.

Ora volglio fare che le intestazioni siano sempre presenti, mentre il corpo della tabella sia l'unico a scorrere.

Mi viene da pensare che devo creare programmaticamente 2 linear layout, Il primo in alto "statico" con le intestazioni e senza barre di scorrimento. Il secondo più in basso con il corpo della tabella scorrevole.

Non so esattamente come fare,
Mi aiutereste per favore ?
Grazie
Saluti
Ceklo
« Ultima modifica: 23 Giugno 2013, 18:23:05 CEST da ceklo »

Offline vincenzoc

  • Utente junior
  • **
  • Post: 148
  • Respect: +47
    • Google+
    • cerminarav
    • Mostra profilo
    • Mie applicazioni sul Play Store
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Vincenzo Cerminara
  • Sistema operativo:
    Arch Linux
Re:Disegnare il layout - tutto via programma.
« Risposta #1 il: 27 Luglio 2013, 14:37:53 CEST »
0
Ciao ceklo,

In breve: si crea un TableLayout con una sola riga (TableRow) in cui si inserisce l'intestazione. Si crea un secondo TableLayout con il contenuto della tabella e lo si inserisce in una ScrollView. Si inserisce il primo Layout e la ScrollView in un LinearLayout e lo si imposta come CurrentView.

Ecco un abbozzo:

Codice (Java): [Seleziona]
import android.app.Activity;
import android.os.Bundle;
import android.widget.TableRow.LayoutParams;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       
        //Layout principale che contiene sia l'intestazione che il corpo della tabella:
        LinearLayout principale=new LinearLayout(this);
        principale.setOrientation(LinearLayout.VERTICAL);
       
        //Creo l'intestazione, fissa
        TableLayout int_layout=new TableLayout(this);
       
        TableRow tl_int=new TableRow(this);
        for(int i=0; i<5; i++){
                TextView tvi=new TextView(this);
                tvi.setText("Int. "+i);
                tvi.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, 1f));
                tl_int.addView(tvi);
        }
        int_layout.addView(tl_int);

        //Creo il corpo della tabella, riempiendolo con 60*5 TextView
        TableLayout corpo=new TableLayout(this);
        for(int i=0; i<60; i++){
                TableRow tri=new TableRow(this);
                for(int j=0; j<5; j++){
                        TextView tvi=new TextView(this);
                        tvi.setText("Elem. "+i+", "+j);
                        tvi.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, 1f));
                        tri.addView(tvi);
                }
                corpo.addView(tri);
        }
       
        ScrollView sv=new ScrollView(this);
        sv.addView(corpo);
       
        principale.addView(int_layout);
        principale.addView(sv);
        setContentView(principale);
    }
   
}

Ad ogni TewtView, come vedi, imposto nuovi LayoutParams così da rendere uniforme la larghezza delle colonne tra intestazione e contenuto, specificando uguale weight=1f.
« Ultima modifica: 27 Luglio 2013, 15:05:16 CEST da vincenzoc »
Ringrazia chi ti aiuta sul forum con l'apposito pulsante :P
Scarica Yazzy

Offline ceklo

  • Nuovo arrivato
  • *
  • Post: 45
  • Respect: +1
    • Mostra profilo
Re:Disegnare il layout - tutto via programma.
« Risposta #2 il: 27 Luglio 2013, 15:06:51 CEST »
0
Grazie Vincenzoc,

E' da un po' che non mi fermo a programmare, tante altre cose da fare....
Oggi ho ricevuto uno stimolo per riprendere, grazie della risposta

Ceklo
triggered by a messagge, :-)

Offline vincenzoc

  • Utente junior
  • **
  • Post: 148
  • Respect: +47
    • Google+
    • cerminarav
    • Mostra profilo
    • Mie applicazioni sul Play Store
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Vincenzo Cerminara
  • Sistema operativo:
    Arch Linux
Re:Disegnare il layout - tutto via programma.
« Risposta #3 il: 01 Agosto 2013, 17:30:03 CEST »
0
È un piacere :-)
In caso di ulteriori problemi chiedi pure  :-)
Ringrazia chi ti aiuta sul forum con l'apposito pulsante :P
Scarica Yazzy

Offline ceklo

  • Nuovo arrivato
  • *
  • Post: 45
  • Respect: +1
    • Mostra profilo
Re:Disegnare il layout - tutto via programma.
« Risposta #4 il: 01 Agosto 2013, 18:51:26 CEST »
0
Grazie vincenzoc,

Ho impiegato un pò di tempo più del previsto, pero ci sono riuscito.
La tabella è composta di una prima riga con le intestazioni di colonna, segue un corpo dotato di barra di scorrimento verticale.
Attenzione: La prima riga è esclusa dalla barra di scorrimento verticale, rimane in alto sempre in vista !

Ho "assemblato" sia intestazione che corpo in un'unica tabella, a quest'ultimo insieme ho applicato una barra di scorrimento orizzontale.
Mi servono entrambe barre di sorrimento, la tabella contiene 100 righe sul corpo e 20 colonne.

L'intestazione quindi "scorre" a destra<--->sinistra solidalmente insieme al corpo della tabella, ma solo il corpo scorre in verticale.

Codice: [Seleziona]
        HorizontalScrollView HSC = new HorizontalScrollView(this);
        ScrollView VSC = new ScrollView(this);
        TableLayout unificazioneTabella = new TableLayout(this); //Tabella che conterrà l'ntestazione + il corpo.
        unificazioneTabella.setGravity(Gravity.CENTER);
        TextView[] values = new TextView[20];

        //Layout creato al volo che conterrà sia l'intestazione che il corpo della tabella:
        LinearLayout layoutAlVolo = new LinearLayout(this);
        layoutAlVolo.setOrientation(LinearLayout.VERTICAL);
       
       //Intestazione della tabella.
        TableLayout tblIntestazione = new TableLayout(this);
                TableRow primaRiga = new TableRow(this);
                primaRiga.setGravity(Gravity.CENTER);
                String intestTabMySQL[] = getResources().getStringArray(R.array.intestazione_tabella_MySQL);
                int[] larghezza_campi_MySQL = getResources().getIntArray(R.array.larghezza_campi_MySQL);
                for (int i = 0; i < 20 ; i++) {
                        values[i] = new TextView(this);
                        values[i].setText(intestTabMySQL[i]);
                        values[i].setMinimumWidth(larghezza_campi_MySQL[i]);
                        values[i].setMaxWidth(larghezza_campi_MySQL[i]);
                        values[i].setPadding(10, 10, 10, 10);
                        values[i].setEnabled(false);
                        values[i].setBackgroundDrawable(getResources().getDrawable(R.drawable.back04));
                        values[i].setTextColor(getResources().getColor(R.color.blue));
                        primaRiga.addView(values[i]);
                }
                tblIntestazione.addView(primaRiga);
               
        //Creo il corpo della tabella, riempiendolo con R100*C20 TextView
        TableLayout tblCorpo = new TableLayout(this);
                for (int j = 0; j < 100; j++) {
                        TableRow rigaAggiunta = new TableRow(this);
                        rigaAggiunta.setGravity(Gravity.CENTER);
                        for (int k = 0; k < 20 ; k++) {
                                values[k] = new TextView(this);
                                values[k].setText(" R" + (j+1) + "C" + (k+1) + " ");
                                values[k].setMinimumWidth(larghezza_campi_MySQL[k]);
                                values[k].setMaxWidth(larghezza_campi_MySQL[k]);
                                values[k].setPadding(10, 10, 10, 10);
                                values[k].setEnabled(false);
                                values[k].setBackgroundDrawable(getResources().getDrawable(R.drawable.back03));
                                values[k].setTextColor(getResources().getColor(R.color.blue));
                                rigaAggiunta.addView(values[k]);
                        }
                        tblCorpo.addView(rigaAggiunta);
                }
                VSC.addView(tblCorpo);
                unificazioneTabella.addView(tblIntestazione);
                unificazioneTabella.addView(VSC);
        HSC.addView(unificazioneTabella);
        layoutAlVolo.addView(HSC);
        setContentView(layoutAlVolo);

Grazie al tuo aiuto sono riuscito.

Saluti
ceklo
« Ultima modifica: 01 Agosto 2013, 18:59:37 CEST da ceklo »