Autore Topic: Creare una ViewGroup: array di grandezza sconosciuta di bottoni  (Letto 1020 volte)

Offline UchihaDD

  • Nuovo arrivato
  • *
  • Post: 16
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows
0
Salve, in questi giorni sto scrivendo nel forum parecchio per problemi più o meno difficili.
Questa serata mi si è presentato il problema di voler creare a tempo di run time un insieme di bottoni da visualizzare su un Activity. Leggendo qualche post sono arrivato a capire che quello che voglio realizzare è una ViewGroup e che posso utilizzare nello schema xml un solo elemento bottone e poi richiamarlo quando lo inserisco nella ViewGroup tutte le volte che mi serve.

Vi posto il codice della classe
Codice (Java): [Seleziona]
public class Luci extends Activity{
        public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        TextView t1 = (TextView)findViewById(R.id.t_home2);
        TextView t2 = (TextView)findViewById(R.id.t_home2);
        ViewGroup layout1=(ViewGroup)findViewById(R.id.layout);  
        t1.setText("Menu Luci\n");

        Database dd = new Database(this);
        dd.open();
        Cursor cur = dd.elencoLuci();
        int nLuci = cur.getCount();
        t1.append("\nSono state trovate "+nLuci+" luci\n");
                 startManagingCursor(cur);
                 int indiceColonne=cur.getColumnIndex(Database.PIN);  
                 int indiceColonne2=cur.getColumnIndex(Database.NAME);
             if(cur.moveToFirst()){  
                for ( int j=0;j<nLuci;j++){
                        t2.append(""+Integer.parseInt(cur.getString(indiceColonne)));
                        t2.append(""+cur.getString(indiceColonne2)+"\n");
                        Button b1 = (Button)findViewById(R.id.button1);
                    Button b2 = (Button)findViewById(R.id.button1);
                    b1.setText("clicco1");
                    b2.setText("clicco2");
                    layout1.removeAllViews();
                    layout1.addView(b1);
                    layout1.addView(b2);
                        cur.moveToNext();
         }
            }
         t1.append("\nSono state trovate luci: "+nLuci);
}

ed il codice xml da me utilizzato:
Codice: [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:id="@+id/layout"
    >
<TextView 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="Per poter agire sulla tua casa, connettiti"
    android:id="@+id/t_home"
    />
    <TextView 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="B1"
    android:id="@+id/t_home2"
    />
            <ListView android:text="TextView"
     android:id="@+id/tlista1"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:padding="10dp"
     android:textSize="16sp" >
     </ListView>
        <Button android:layout_height="wrap_content" android:id="@+id/button1" android:layout_width="wrap_content" android:text="Connessione"></Button>
        <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:orientation="vertical"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:id="@+id/layout2">
    </LinearLayout>
</LinearLayout>

Nel codice il problema che mi da logcat è:

Caused by: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.

E/AndroidRuntime(  954):    at android.view.ViewGroup.addViewInner(ViewGroup.java:1816)

E/AndroidRuntime(  954):    at android.view.ViewGroup.addView(ViewGroup.java:1711)

E/AndroidRuntime(  954):    at android.view.ViewGroup.addView(ViewGroup.java:1668)

E/AndroidRuntime(  954):    at android.view.ViewGroup.addView(ViewGroup.java:1648)

E/AndroidRuntime(  954):    at android.domotic.Luci.onCreate(Luci.java:41)

E/AndroidRuntime(  954):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)

E/AndroidRuntime(  954):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2231)


Non riesco a capire come fare ad aggiungere i bottoni che mi servono a tempo run time nel mio programma. Vi chiedo un altro grande aiuto

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Creare una ViewGroup: array di grandezza sconosciuta di bottoni
« Risposta #1 il: 15 Marzo 2011, 11:56:05 CET »
0
Non ho ben capito... dove dovrebbero stare questi bottoni?
Dentro il LinearLayout con android:id="@+id/layout2" ?

Comunque l'idea è che tu li crei programmaticamente...

Codice (Java): [Seleziona]
ViewGroup parent = (ViewGroup) findViewById(R.id.contenitore);

for(int i=0; i< 10; i++){
        Button b = new Button(this);
        b.setText("Bottone" + i);
        parent.addView(b);
}

« Ultima modifica: 15 Marzo 2011, 11:59:47 CET da Ricky` »

Offline UchihaDD

  • Nuovo arrivato
  • *
  • Post: 16
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows
Re:Creare una ViewGroup: array di grandezza sconosciuta di bottoni
« Risposta #2 il: 15 Marzo 2011, 13:31:52 CET »
0
Grazie mille come sempre funziona ogni vostro consiglio!!

In particolare io si volevo inserire dentro il layout "layout2" un insieme di due bottoni e l'ho fatto basta inserire come contenitore il FindViewById relativo all'id "layout2"...

In particolare io vorrei che nel mio layout ci fosse:
scritta, bottone, bottone -----> TextView,Button,Button create dinamicamente

Ho provato ad inserire un Table Layout ma non riesco a impostare la width e height dei bottoni nemmeno con i metodi opportuni .setWidth(int pixel)  .setHeigth(int pixel), ed inoltre la textView non mi si vede...

ecco il codice
Codice (Java): [Seleziona]
Database dd = new Database(this);
        dd.open();
        Cursor cur = dd.elencoLuci();
        int nLuci = cur.getCount();
        t1.append("\nSono state trovate "+nLuci+" luci\n");
                 startManagingCursor(cur);
                 int indiceColonne=cur.getColumnIndex(Database.PIN);  
                 int indiceColonne2=cur.getColumnIndex(Database.NAME);
             if(cur.moveToFirst()){  
                for ( int j=0;j<nLuci;j++){
                        Button b1 = new Button(this);
                        TextView t2 = new TextView(this);
                        t2.append(""+Integer.parseInt(cur.getString(indiceColonne)));
                        t2.append(" "+cur.getString(indiceColonne2));
                    Button b2 =  new Button(this);
                    b1.setText("accendi");
                    b1.setHeight(30);
                    b1.setWidth(50);
                    b2.setText("spegni");
                    b2.setHeight(30);
                    b2.setWidth(50);
                    contenitore.addView(b1);
                    contenitore.addView(b2);
                        cur.moveToNext();
         }
Codice: [Seleziona]
        <TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:orientation="vertical"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:id="@+id/layout2">
    </TableLayout>
« Ultima modifica: 15 Marzo 2011, 13:51:07 CET da UchihaDD, Reason: aggiunta richieste »

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Creare una ViewGroup: array di grandezza sconosciuta di bottoni
« Risposta #3 il: 15 Marzo 2011, 14:12:16 CET »
0
Le tabelle per fare i layout non si usano più nemmeno in html, figuriamoci  in Android.
Ti conviene dare un'occhio a come funzionano i vari layout che hai a disposizione, capirai che non ti serve proprio una tabella.
Comunque il metodo addView prende un secondo parametro, è un oggetto che ti permette di impostare le dimensioni del componente che stai inserendo. Googla un pochino e troverai una miriade di codice ;)

Offline UchihaDD

  • Nuovo arrivato
  • *
  • Post: 16
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows
Re:Creare una ViewGroup: array di grandezza sconosciuta di bottoni
« Risposta #4 il: 15 Marzo 2011, 22:08:15 CET »
0
Sono riuscito a impostare la dimensione di ogni elemento direttamente così:

Codice (Java): [Seleziona]
                    contenitore.addView(b1,30,30);
                    contenitore.addView(t2,50,30);
                    contenitore.addView(b2,80,30);
oppure
Codice (Java): [Seleziona]
                     contenitore.addView(b1,ViewGroup.LayoutParams.WRAP_CONTENT);
                    contenitore.addView(t2,50,30);
                    contenitore.addView(b2,80,30);

Ora però il problema è il seguente, non riesco a trovare un esempio in cui da qui si procede all'allignamento degli elementi.. tutti lo fanno attraverso xml con un RelativeLayout... su google nn ho trovato esempi che mi risolvessero questo problema
Io invece vorrei allineare dinamicamente  t2 b1 e b2 sulla stessa riga... come posso fare?

Offline UchihaDD

  • Nuovo arrivato
  • *
  • Post: 16
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows
Re:Creare una ViewGroup: array di grandezza sconosciuta di bottoni
« Risposta #5 il: 15 Marzo 2011, 23:15:12 CET »
0
Ok sono arrivato a questo punto anche dopo aver consultato la discussione di questo forum:
Posizionamento dei view creati dinamicamente  - Android Developers Italia

il mio problema è che fatto l'allineamento orizzontale con la costante RIGHT_OF avrei bisogno anche di iniziare ad allineare dal secondo ciclo in poi anche verticalmente... cioè ad esempio creare una nuova riga e allineare i corrispettivi come sopra...

Non so come fare ho provato con il codice qui sotto, ma mi viene ancora una sola riga di elementi... addirittura sfalsati tra loro

Codice (Java): [Seleziona]
        Database dd = new Database(this);
        dd.open();
        Cursor cur = dd.elencoLuci();
        int nLuci = cur.getCount();
        t1.append("\nSono state trovate "+nLuci+" luci\n");
                 startManagingCursor(cur);
                 int indiceColonne=cur.getColumnIndex(Database.PIN);  
                 int indiceColonne2=cur.getColumnIndex(Database.NAME);

             ViewGroup contenitore = (ViewGroup)findViewById(R.id.layout2);  
             if(cur.moveToFirst()){  
                for ( int j=0;j<nLuci;j++){
                        Button b1 = new Button(this);
                        TextView t2 = new TextView(this);
                        t2.append(""+Integer.parseInt(cur.getString(indiceColonne)));
                        t2.append(" "+cur.getString(indiceColonne2));
                    Button b2 =  new Button(this);
                    b1.setText("accendi");
                    b1.setHeight(30);
                    b1.setWidth(50);
                    b2.setText("spegni");
                    b2.setHeight(30);
                    b2.setWidth(50);
                    t2.setId(j);
                    b1.setId(j+nLuci+1);
                    b2.setId(j+2*nLuci+1);
                    RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
                            RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
                    lp.addRule(RelativeLayout.ALIGN_PARENT_LEFT, t2.getId());
                    if(j>0)
                        lp.addRule(RelativeLayout.ABOVE, j-1);
                   
                    RelativeLayout.LayoutParams lp1 = new RelativeLayout.LayoutParams(
                            RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
                    lp1.addRule(RelativeLayout.RIGHT_OF, t2.getId());
                    if(j>0)
                        lp1.addRule(RelativeLayout.ALIGN_BOTTOM, j);
                    RelativeLayout.LayoutParams lp2 = new RelativeLayout.LayoutParams(
                            RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
                    lp2.addRule(RelativeLayout.RIGHT_OF, b1.getId());
                    if(j>0)
                        lp1.addRule(RelativeLayout.ALIGN_BOTTOM, j+nLuci+1);
                    contenitore.addView(t2,lp);        
                    contenitore.addView(b1, lp1);
                    contenitore.addView(b2, lp2);
                   /* contenitore.addView(b1,ViewGroup.LayoutParams.WRAP_CONTENT);
                    contenitore.addView(t2,50,30);
                    contenitore.addView(b2,80,30);*/

                        cur.moveToNext();
         }

Questo è il layout 2 a cui faccio riferimento:
Codice: [Seleziona]
        <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:orientation="vertical"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:id="@+id/layout2">
    </RelativeLayout>

In generale la mia idea è settare gli id dinamicamente in base al valore della variabile di ciclo ma con ALIGN_BOTTOM e ABOVE non mi riesce la soluzione che ho in mente... Eppure credo che queste due costanti siano quelle giuste...

Offline UchihaDD

  • Nuovo arrivato
  • *
  • Post: 16
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows
Re:Creare una ViewGroup: array di grandezza sconosciuta di bottoni
« Risposta #6 il: 16 Marzo 2011, 13:58:59 CET »
0
Allora il codice che mi viene stampato è questo:
Codice: [Seleziona]
I/ActivityManager(   51): Starting activity: Intent { cmp=android.domotic/.Luci }

I/        ( 1254): ID t2_0 0

I/        ( 1254): ID b1_0 3

I/        ( 1254): ID b2_0 5

I/        ( 1254): t1_0: LEFT 0

I/        ( 1254): b1_0: RIGHT0

I/        ( 1254): b2_0: RIGHT 3

I/        ( 1254): ID t2_1 1

I/        ( 1254): ID b1_1 4

I/        ( 1254): ID b2_1 6

I/        ( 1254): t1_1: BELOW 0

I/        ( 1254): b1_1: BELOW 3

I/        ( 1254): b2_1: RIGHT 4

I/ActivityManager(   51): Displayed activity android.domotic/.Luci: 204 ms (total 204 ms)

Se io faccio il logcat di questo codice mio

Codice (Java): [Seleziona]
if(cur.moveToFirst()){  
                 int j=0;
                for (  j=0;j<nLuci;j++){
                        t2[j] =new TextView(this);

                        b1[j] = new Button(this);
                        b2[j] = new Button(this);
                        //Button b1 = new Button(this);
                        //TextView t2 = new TextView(this);
                        t2[j].append(""+Integer.parseInt(cur.getString(indiceColonne)));
                        t2[j].append(" "+cur.getString(indiceColonne2));
                    //Button b2 =  new Button(this);
                    b1[j].setText("b1 "+j);
                    b2[j].setText("b2 "+j);
                   
                    t2[j].setId(j);
                    b1[j].setId(j+nLuci+1);
                    b2[j].setId(j+2*nLuci+1);
                   // t2[].setId(j);
                    //b1.setId(j+nLuci+1);
                    //b2.setId(j+2*nLuci+1);
                    Log.i(null, "ID t2_"+j+" "+t2[j].getId());
                    Log.i(null, "ID b1_"+j+" "+b1[j].getId());
                    Log.i(null, "ID b2_"+j+" "+b2[j].getId());
                    RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
                    RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
                    if(j==0){
                        lp.addRule(RelativeLayout.ALIGN_PARENT_LEFT, t2[j].getId());
                        Log.i(null, "t1_0: LEFT "+t2[j].getId());
                    }
                    if(j>0){
                        lp.addRule(RelativeLayout.BELOW, t2[j-1].getId() );
                        Log.i(null, "t1_1: BELOW "+t2[j-1].getId());
                    }
                    contenitore.addView(t2[j],lp);
                   
                    RelativeLayout.LayoutParams lp1 = new RelativeLayout.LayoutParams(
                    RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
                    if(j==0){
                        lp1.addRule(RelativeLayout.RIGHT_OF, t2[j].getId());
                        Log.i(null, "b1_0: RIGHT"+t2[j].getId());
                    }
                    if(j>0){
                        Log.i(null, "b1_1: BELOW"+b1[j-1].getId());
                        lp1.addRule(RelativeLayout.BELOW, b1[j-1].getId() );
                    }
                       
                    contenitore.addView(b1[j], lp1);
                   
                    RelativeLayout.LayoutParams lp2 = new RelativeLayout.LayoutParams(
                    RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
                    if(j==0){
                        Log.i(null, "b2_0: RIGHT "+b1[j].getId());
                        lp2.addRule(RelativeLayout.RIGHT_OF, b1[j].getId());
                    }
                    if(j>0){
                        Log.i(null, "b2_1: BELOW "+b1[j].getId());
                        lp2.addRule(RelativeLayout.RIGHT_OF, b1[j].getId());
                    }
                           
                    contenitore.addView(b2[j], lp2);
                   /* contenitore.addView(b1,ViewGroup.LayoutParams.WRAP_CONTENT);
                    contenitore.addView(t2,50,30);
                    contenitore.addView(b2,80,30);*/

                        cur.moveToNext();
         }

Non riesco capire però perchè il bottone con id 6 mi si sovrapponga a quello con id 4 anche se giustamente mi viene fatto il RIGHT_OF(id=4)... mah... avete idee?