Autore Topic: Come fare ad inserire delle Editext da button e memorizzarne lo stato.  (Letto 1641 volte)

Offline dr4gone

  • Utente junior
  • **
  • Post: 66
  • Respect: +1
    • Mostra profilo
Ciao a tutti.. avrei bisogno di implementare questo comportamento:
Ho una edittext con di fianco un pulsante aggiungi, quando il pulsante viene premuto salvo nelle sharedpreferences il valore contenuto nella prima edittext, e contemporaneamente viene aperta la seconda edittext...

Per capire melgio cosa vorrei realizzare, andate nella rubrica android e fate aggiungi contatto , se prendete il campo Telefono e aggiungete un numero. avrete lo stesso effetto che vorrei ottenere io.

Sono riuscito ad ottenere qualcosa giocando con setVisibility(0|1|2). Ma non credo che sia il modo corretto, in quanto così sono costretto a stabilire un numero massimo di edittext da creare nell'xml e renderle visibili all'occorrenza.

Avete idea di come si possa implemetrae una cosa simile a quello in foto? Grazie





Offline dr4gone

  • Utente junior
  • **
  • Post: 66
  • Respect: +1
    • Mostra profilo
Re:Come fare ad inserire delle Editext da button e memorizzarne lo stato.
« Risposta #1 il: 15 Gennaio 2012, 13:30:48 CET »
0
Nessun input almeno per sapere dove mi devo indirizzare?

Offline blackgin

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1387
  • Respect: +164
    • Google+
    • blackgins
    • blackginsoft
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Sistema operativo:
    Mac OSX 10.8
Re:Come fare ad inserire delle Editext da button e memorizzarne lo stato.
« Risposta #2 il: 15 Gennaio 2012, 17:03:37 CET »
0
Crea l'EditText da visualizzare programmaticamente, direttamente da codice java.
Postate il LogCat LogCat LogCat LogCat LogCat

Offline dr4gone

  • Utente junior
  • **
  • Post: 66
  • Respect: +1
    • Mostra profilo
Re:Come fare ad inserire delle Editext da button e memorizzarne lo stato.
« Risposta #3 il: 15 Gennaio 2012, 17:26:04 CET »
0
Grazie sei stato illuminante!
Ci lavorerò su  ;-)

Offline dr4gone

  • Utente junior
  • **
  • Post: 66
  • Respect: +1
    • Mostra profilo
Re:Come fare ad inserire delle Editext da button e memorizzarne lo stato.
« Risposta #4 il: 17 Gennaio 2012, 15:10:15 CET »
0
ok sono riuscito ad ottenere qualcosa di buono.
Riesco ad aggiungere EditText e pulsante per eliminare l'edittext. Ma ho dei dubbi:
1) come faccio a eliminare le edittext create dinamicamente ??
2) come identifico univocamente ognuna delle edittext create dinamicamente per poter accedere ai dati inseriti?
3) per salvare lo stato del layout anche per le successive aperture dell'activity cosa si usa? Potrei usare in qualche modo le SharedPreferences?

Intanto questo è quello che ho scritto:
Codice (Java): [Seleziona]
public class LayoutDinamico extends Activity{
        int counter = 1;
    Button btn;
    EditText et;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        btn = (Button)findViewById(R.id.btn_add);
        btn.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                addNewElement();
         
                                        }
                        });
    }
  public void addNewElement(){
          TableLayout table = (TableLayout) findViewById(R.id.TableLayout01);
      TableRow row = new TableRow(this);

      et = new EditText(this);
      et.setText("");
      et.setId(counter++);
      et.setMinLines(1);
      et.setMaxLines(1);

      Button b = new Button(this);
      b.setText("-");

      row.addView(et);
      row.addView(b);

      table.addView(row,new TableLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
     
      Toast toast = Toast.makeText(this, "Aggiunta edittext numero:  " + et.getId(), Toast.LENGTH_SHORT);
      toast.show();
  }
}

E questo è il layout che ho creato
Codice (XML): [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"
   >

<TableLayout
     android:id="@+id/TableLayoutPrincipale"
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:stretchColumns="0">
 
    <TableRow
       android:id="@+id/TableRowPrincipale"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content">

        <TextView
           android:id="@+id/tv_aggiungi"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="Aggiungi" />
        <Button
         android:id="@+id/btn_add"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:text="+" />

    </TableRow>
 
  </TableLayout>
 
<ScrollView
   android:id="@+id/ScrollView"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content">
 
  <TableLayout
     android:id="@+id/TableLayout01"
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:stretchColumns="0">
 
    <TableRow
       android:id="@+id/TableRow01"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content">

        <EditText
           android:id="@+id/editText1"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content" >

            <requestFocus />
        </EditText>

      <Button
         android:id="@+id/Btn_del"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:text="-" />

    </TableRow>
 
  </TableLayout>

</ScrollView>

        <LinearLayout
           android:layout_width="fill_parent"
               style="@android:style/ButtonBar"
               android:id="@+id/buttonBar"
               android:layout_height="wrap_content"
               android:layout_alignParentBottom="true"
               android:orientation="vertical">


                <Button
                   android:id="@+id/btn_save"
                   android:layout_width="wrap_content"
                   android:layout_height="wrap_content"
                   android:layout_gravity="center"
                   android:layout_marginTop="2dp"
                   android:text="Salva" >
</Button>

        </LinearLayout>

</LinearLayout>

Ecco cosa ne esce fuori:
Schermata inizialeInizio ad aggiungere le edittext

La buttonbar Salva la potrei fare stare sotto con il RelativeLayout... ma questo poi si vedrà
Intanto idee su come possa fare per i miei primi tre quesiti?

Offline teskio

  • Moderatore globale
  • Utente normale
  • *****
  • Post: 387
  • Respect: +118
    • Github
    • Google+
    • Mostra profilo
    • Skullab
  • Dispositivo Android:
    Cubot GT99 / SurfTab Ventos 10.1
  • Play Store ID:
    Skullab Software
  • Sistema operativo:
    windows 7 / ubuntu 12.04
Re:Come fare ad inserire delle Editext da button e memorizzarne lo stato.
« Risposta #5 il: 18 Gennaio 2012, 01:01:11 CET »
0
1) Associa al button creato dinamicamente un OnCLickListener e usa il metodo removeView(View view) di TableLayout (ereditato da ViewGroup | Android Developers) passandogli il riferimento della TableRow creato dinamicamente.

2) Dal codice che hai postato hai settato un id per le EditText, credo che possa aiutare  :-P

3) Non ho capito...vuoi salvare il numero di EditText generate in modo da ricreare la stessa quantità di EditText all'apertura successiva ? Le SharedPreferences possono fare al caso tuo, ma tutto dipende da come stai strutturando il codice :D

Consiglio :
Codice (Java): [Seleziona]
TableLayout table = (TableLayout) findViewById(R.id.TableLayout01);definiscilo nell'onCreate invece di ricrearlo ogni volta nel metodo addNewElement :-P

Offline dr4gone

  • Utente junior
  • **
  • Post: 66
  • Respect: +1
    • Mostra profilo
Re:Come fare ad inserire delle Editext da button e memorizzarne lo stato.
« Risposta #6 il: 18 Gennaio 2012, 09:29:01 CET »
0
2) Dal codice che hai postato hai settato un id per le EditText, credo che possa aiutare  :-P
Si l'vevo implementato apposta per cercare di definirle, ma dato che poi il contenuto dell'editext lo devo salvare e passare ad altre activity, ero andato un po in confusione, ma risolverò con le sharedpreferences e le variabili globali :)
Citazione
3) Non ho capito...vuoi salvare il numero di EditText generate in modo da ricreare la stessa quantità di EditText all'apertura successiva ? Le SharedPreferences possono fare al caso tuo, ma tutto dipende da come stai strutturando il codice :D
Si esatto, ci lavorerò un po su (tempo permettendo :D)
Grazie degli utili suggerimenti, ritornerò sicuramente a chiedere ;)
Buona giornata

Offline dr4gone

  • Utente junior
  • **
  • Post: 66
  • Respect: +1
    • Mostra profilo
Re:Come fare ad inserire delle Editext da button e memorizzarne lo stato.
« Risposta #7 il: 20 Gennaio 2012, 13:18:08 CET »
0
ho dei problemini riguardo all'eliminazione delle editext.
Ho cambiato un po di cose nel codice e nel file xml.
Non riesco ad inquadrare bene i riferimenti ai vari layout creati volta per volta...
Il metodo che ho sciritto è questo:
Codice (Java): [Seleziona]
public void removeRow()
  {
  try
  {
          ((TableLayout)row.getParent()).removeView(row);
                counter--;
                Toast toast = Toast.makeText(this, "rimosso elemento  " + et.getId(), Toast.LENGTH_SHORT);
              toast.show();
  }
      catch (Exception e) {
      Log.w("Errore",": "+e.toString());
      Toast toast = Toast.makeText(this, "Errore: " +e.toString(), Toast.LENGTH_SHORT);
              toast.show();
      }
        finally {
        }
  }

Se aggiungo una editext dinamicamente e poi la elimino, questo codice va bene. funziona
Ma se ne aggiungo 2 in una volta, e poi cerco di cancellarle, mi cancella solo l'ultima che ho inserito, l'altra mi ritorna un errore java.lang.NullPointerException.

Ecco perchè dico che non riesco ad inquadrare bene il problema.. è ovvio che non mi trova il layout da eliminare.. ma come faccio a farglielo trovare??

L'errore è qui:
Codice (Java): [Seleziona]
 ((TableLayout)row.getParent()).removeView(row);
idee su come sistemarlo?

Offline teskio

  • Moderatore globale
  • Utente normale
  • *****
  • Post: 387
  • Respect: +118
    • Github
    • Google+
    • Mostra profilo
    • Skullab
  • Dispositivo Android:
    Cubot GT99 / SurfTab Ventos 10.1
  • Play Store ID:
    Skullab Software
  • Sistema operativo:
    windows 7 / ubuntu 12.04
Re:Come fare ad inserire delle Editext da button e memorizzarne lo stato.
« Risposta #8 il: 20 Gennaio 2012, 19:27:02 CET »
0
Dipende da che riferimento passi al metodo removeView()  :-)
Io personalmente avrei inserito il codice di rimozione nel metodo che tu hai chiamato addNewElement...così :
Codice (Java): [Seleziona]
public void addNewElement(){
          TableLayout table = (TableLayout) findViewById(R.id.TableLayout01);
      TableRow row = new TableRow(this);

      et = new EditText(this);
      et.setText("");
      et.setId(counter++);
      et.setMinLines(1);
      et.setMaxLines(1);

      Button b = new Button(this);
      b.setText("-");
      b.setOnClickListener(new OnClickListener(){
          public void onClick(View view){
              // qui il codice di rimozione dell'elemento, dato che hai già il riferimento alla row appena creato
          }
      });

      row.addView(et);
      row.addView(b);

      table.addView(row,new TableLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
     
      Toast toast = Toast.makeText(this, "Aggiunta edittext numero:  " + et.getId(), Toast.LENGTH_SHORT);
      toast.show();
  }

Offline dr4gone

  • Utente junior
  • **
  • Post: 66
  • Respect: +1
    • Mostra profilo
Re:Come fare ad inserire delle Editext da button e memorizzarne lo stato.
« Risposta #9 il: 21 Gennaio 2012, 01:59:35 CET »
0
si, infatti avevo fatto cosi:
Codice (Java): [Seleziona]
public class LayoutDinamico extends Activity{
        int idEt = 1;
        int idBtn_del = 1;
        Button btn_add;
        Button btn_del;
        Button btn_save;
    Button b_del;
    EditText et;
    TableLayout table;
    TableRow row;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        table = (TableLayout) findViewById(R.id.TableLayout01);
        btn_add = (Button)findViewById(R.id.btn_add);
        btn_add.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                addNewElement();
         
                                        }
                        });
        btn_save = (Button)findViewById(R.id.btn_save);
        btn_save.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                 saveAnswers();
               
         
                                        }
                        });
       
           
    }
  public void addNewElement(){
         
      row = new TableRow(this);

      et = new EditText(this);
      et.setText("");
      et.setId(idEt++);
      et.setMinLines(1);
      et.setMaxLines(1);

      btn_del = new Button(this);
      btn_del.setText("-");
      btn_del.setId(idBtn_del++);
      btn_del.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                removeRow();
                                }
                });
     

      row.addView(et);
      row.addView(btn_del);
      table.addView(row);
     
      Toast toast = Toast.makeText(this, "Aggiunto elemento  " + et.getId(), Toast.LENGTH_SHORT);
      toast.show();
     
  }
 
 
  public void removeRow()
  {
  try
  {
          ((TableLayout)row.getParent()).removeView(row);
                idEt--;
                Toast toast = Toast.makeText(this, "rimosso elemento  " + et.getId(), Toast.LENGTH_SHORT);
              toast.show();
  }
      catch (Exception e) {
      Log.w("Errore",": "+e.toString());
      Toast toast = Toast.makeText(this, "Errore: " +e.toString(), Toast.LENGTH_SHORT);
              toast.show();
      }
        finally {
        }
  }
  public void saveAnswers() {
      TableLayout root = (TableLayout) findViewById(R.id.TableLayout01);
      query (root);
      Toast toast = Toast.makeText(this, "Salvato contenuto ID:  " + et.getId(), Toast.LENGTH_SHORT);
       toast.show();
  }

  private void query (ViewGroup parent) {
      for(int i = 0; i < parent.getChildCount(); i++) {
          View child = parent.getChildAt(i);
          if(child instanceof EditText) {
              //Support for EditText
              EditText et = (EditText)child;
              Log.w("EDIT TEXT DINAMICO:", "ID: "+et.getId() +"  Contenuto : "+ et.getText());
          }
         
          else {
              //Eventuali altri controlli
          }

          if(child instanceof ViewGroup) {
              //Nested Q&A
              ViewGroup group = (ViewGroup)child;
              query(group);
          }
      }
  }

 

}

Credo che sia equivalente a quello che hai suggerito tu..
Il problema comunque rimane.. se aggiungo più di una editText, mi cancella sempre e solo l'ultima.. anche se cerco di cancellare la prima.
Poi mi da errore.

Per completezza metto anche L'xml aggiornato
Codice (XML): [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"
   >

<TableLayout
     android:id="@+id/TableLayoutPrincipale"
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:stretchColumns="0">
 
    <TableRow
       android:id="@+id/TableRowPrincipale"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content">

        <TextView
           android:id="@+id/tv_aggiungi"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="Aggiungi" />
        <Button
         android:id="@+id/btn_add"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:text="+" />

    </TableRow>
 
  </TableLayout>
 
<ScrollView
   android:id="@+id/ScrollView"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content">
 
  <TableLayout
     android:id="@+id/TableLayout01"
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:stretchColumns="0">
 
  </TableLayout>

</ScrollView>

        <LinearLayout
           android:layout_width="fill_parent"
               style="@android:style/ButtonBar"
               android:id="@+id/buttonBar"
               android:layout_height="wrap_content"
               android:layout_alignParentBottom="true"
               android:orientation="vertical">


                <Button
                   android:id="@+id/btn_save"
                   android:layout_width="wrap_content"
                   android:layout_height="wrap_content"
                   android:layout_gravity="center"
                   android:layout_marginTop="2dp"
                   android:text="Salva" >
</Button>

        </LinearLayout>

Offline teskio

  • Moderatore globale
  • Utente normale
  • *****
  • Post: 387
  • Respect: +118
    • Github
    • Google+
    • Mostra profilo
    • Skullab
  • Dispositivo Android:
    Cubot GT99 / SurfTab Ventos 10.1
  • Play Store ID:
    Skullab Software
  • Sistema operativo:
    windows 7 / ubuntu 12.04
Re:Come fare ad inserire delle Editext da button e memorizzarne lo stato.
« Risposta #10 il: 21 Gennaio 2012, 07:57:48 CET »
0
Mi cito da solo  :-P
Citazione
Dipende da che riferimento passi al metodo removeView() 

e a quanto pare il metodo che implementi per rimuovere la view va a ripescarsi solo l'ultima "row" creata...poichè utilizzi una variabile di classe che man mano vai a reinizializzare quando crei una nuova riga. Crea una variabile locale nel tuo metodo "addNewElement" che andrai a inizializzare ad ogni chiamata al metodo e poi passa quel riferimento al metodo removeView. 

Era questo che suggerivo  :-)

Offline dr4gone

  • Utente junior
  • **
  • Post: 66
  • Respect: +1
    • Mostra profilo
Re:Come fare ad inserire delle Editext da button e memorizzarne lo stato.
« Risposta #11 il: 21 Gennaio 2012, 08:37:51 CET »
0
Sei un grande, funziona benissimo!!!  ;-)
Sono io che a volte sono di coccio...  :D

In questi giorni mi dedicherò al salvataggio del layout e a quello dei contenuti delle edittext.. :)
Vediamo quello che ne uscirà :)

Grazie ancora

Offline topperharley

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
Re:Come fare ad inserire delle Editext da button e memorizzarne lo stato.
« Risposta #12 il: 25 Novembre 2012, 15:18:31 CET »
0
Ciao dr4agone,
mi sono incartato in un problema molto simile al tuo (il risultato che vorrei ottenere è praticamente lo stesso), daresti un'occhiata al mio topic per favore? http://www.anddev.it/index.php/topic,9435.0.html

o in alternativa potresti postare la porzione di codice corretta così prendo spunto???  :D
ti ringrazio per la disponibilità
Ciao
Topper

Offline dr4gone

  • Utente junior
  • **
  • Post: 66
  • Respect: +1
    • Mostra profilo
Re:Come fare ad inserire delle Editext da button e memorizzarne lo stato.
« Risposta #13 il: 25 Novembre 2012, 16:02:28 CET »
0
Purtroppo ho perso quel codice e non mi ricordo bene cosa e come avevo fatto.
Ma se ti applichi seguendo la base di questo topic e segui il suggerimento finale e risolutivo di Teskio ci arriverai come ho fatto io all'epoca.
Onestamente non mi ricoedo nemmeno perchè l'avevo usato.. è passato quasi un anno ;)

P.s.
Rileggendo il topic e riguardando il codice, quello che devi fare è non usare l'edittext "et" che ho definito come variabile esterna, ma definirla come variabile locale in add new element.. Come ha suggerito chiaramente Teskio.

Buon divertimento ;)
« Ultima modifica: 25 Novembre 2012, 16:06:49 CET da dr4gone »

Offline topperharley

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
Re:Come fare ad inserire delle Editext da button e memorizzarne lo stato.
« Risposta #14 il: 25 Novembre 2012, 16:38:49 CET »
0
Mannaggia che zuccone che sono!!! il tuo 'edittext "et" ' mi ha illuminato!!! il ragionamento della variabile interna lo facevo sul mio contatore "i" (tuo idET) che usavo per settare l'id e non sul nome dell'oggetto creato...  o_O è proprio vero che quanto ci si fissa su una cosa ...
Grazie mille dr4gone!!!!!!!!  e naturalmente un ringraziamento anche a Teskio che ha risolto il problema mesi orsono!!!  ;-)
Ciao