Autore Topic: Classe Listener  (Letto 602 volte)

Offline winner03

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    HTC MAGIC
  • Sistema operativo:
    Windows 7
Classe Listener
« il: 03 Febbraio 2011, 15:09:58 CET »
0
Ciao a tutti.

Sono alle prime arme con l'SDK di Android.

Ho iniziato a fare un semplice programma, con un pò di edit text e un pulsante. Semplicemente prendo il valore e richiamo un medoto.

Siccome mi piace complicarmi la vita, ho trovato brutto definire l'azione onClick dentro la mia classe principale, quindi ho creato una classe per l'evento onClick guardate il codice:
Codice (Java): [Seleziona]
public class prova extends Activity {

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Button button = (Button) findViewById(R.id.Button);
        button.setOnClickListener(new InviaClick());
    }
}

a questo punto definisco la mia classe InviaClick()
Codice (Java): [Seleziona]
public class InviaClick  extends Activity implements OnClickListener{
       
        @Override
        public void onClick(View v) {
        EditText nome = (EditText)findViewById(R.id.nome);
        EditText cognome = (EditText)findViewById(R.id.cognome);
        EditText email = (EditText)findViewById(R.id.email);
        EditText id = (EditText)findViewById(R.id.id);
ecc.....
         MIO METODO PARAMETRI.

Purtroppo mi torna l'eccezione Java Null Pointer appena tenta di fare il findView, mentre se metto
Codice (Java): [Seleziona]
EditText nome = (EditText)v.findViewById(R.id.nome);non va in eccezzione ma l'oggetto è nullo perchè R.id.nome non esiste nella View.

Come faccio a passare il riferimento dei miei oggetti EditText o alla view iniziale??

Offline tharos70

  • Nuovo arrivato
  • *
  • Post: 20
  • Respect: 0
    • tharos70
    • Mostra profilo
  • Dispositivo Android:
    Nexus One
  • Play Store ID:
    tharos70
  • Sistema operativo:
    ubuntu 10.10
Re:Classe Listener
« Risposta #1 il: 03 Febbraio 2011, 15:22:41 CET »
0
Direi che la soluzione potrebbe essere questa..... (mancano le import da eclipse ctrl-shift-o)
La findViewById Restituisce un oggetto nullo se la invochi al di fuori del metodo onCreate()

Codice (Java): [Seleziona]
public class prova extends Activity implements OnClickListener {
 
private EditText nome = (EditText)findViewById(R.id.nome);
private EditText cognome = (EditText)findViewById(R.id.cognome);
private EditText email = (EditText)findViewById(R.id.email);
private EditText id = (EditText)findViewById(R.id.id);

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Button button = (Button) findViewById(R.id.Button);
        button.setOnClickListener(this);
        nome = (EditText)findViewById(R.id.nome);
        cognome = (EditText)findViewById(R.id.cognome);
        email = (EditText)findViewById(R.id.email);
        id = (EditText)findViewById(R.id.id);
    }

     @Override
     public void onClick(View v) {
     
         TUO METODO PARAMETRI.
     }
}

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Classe Listener
« Risposta #2 il: 03 Febbraio 2011, 15:22:58 CET »
+1
Per quale motivo la classe InviaClick estende Activity?
Io farei una cosa del genere:

Codice (Java): [Seleziona]
public class InviaClick implements OnClickListener{

        private Activity mActivity;
       
        public InviaClick(Activity activity){
                mActivity = activity;
        }

        @Override
        public void onClick(View v) {
                EditText nome = (EditText)mActivity.findViewById(R.id.nome);
                EditText cognome = (EditText)mActivity.findViewById(R.id.cognome);
                EditText email = (EditText)mActivity.findViewById(R.id.email);
                EditText id = (EditText)mActivity.findViewById(R.id.id);

        ......
        }
}

poi modifica l'assegnamento del listener con

Codice (Java): [Seleziona]
button.setOnClickListener(new InviaClick(this));

Offline tharos70

  • Nuovo arrivato
  • *
  • Post: 20
  • Respect: 0
    • tharos70
    • Mostra profilo
  • Dispositivo Android:
    Nexus One
  • Play Store ID:
    tharos70
  • Sistema operativo:
    ubuntu 10.10
Re:Classe Listener
« Risposta #3 il: 03 Febbraio 2011, 15:24:51 CET »
0
Interessante questa soluzione... e anche più aderente al codice originale.

Per quale motivo la classe InviaClick estende Activity?
Io farei una cosa del genere:

Codice (Java): [Seleziona]
public class InviaClick implements OnClickListener{

        private Activity mActivity;
       
        public InviaClick(Activity activity){
                mActivity = activity;
        }

        @Override
        public void onClick(View v) {
                EditText nome = (EditText)mActivity.findViewById(R.id.nome);
                EditText cognome = (EditText)mActivity.findViewById(R.id.cognome);
                EditText email = (EditText)mActivity.findViewById(R.id.email);
                EditText id = (EditText)mActivity.findViewById(R.id.id);

        ......
        }
}

poi modifica l'assegnamento del listener con

Codice (Java): [Seleziona]
button.setOnClickListener(new InviaClick(this));

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Classe Listener
« Risposta #4 il: 03 Febbraio 2011, 15:30:01 CET »
0
Si ma non ha nessun particolare beneficio rispetto all'approccio "classico"

Offline tharos70

  • Nuovo arrivato
  • *
  • Post: 20
  • Respect: 0
    • tharos70
    • Mostra profilo
  • Dispositivo Android:
    Nexus One
  • Play Store ID:
    tharos70
  • Sistema operativo:
    ubuntu 10.10
Re:Classe Listener
« Risposta #5 il: 03 Febbraio 2011, 15:32:04 CET »
0
No in effetti no...  :-)

Offline winner03

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    HTC MAGIC
  • Sistema operativo:
    Windows 7
Re:Classe Listener
« Risposta #6 il: 03 Febbraio 2011, 15:43:21 CET »
0
Beneficio nella leggibilità del codice.

Cmq grz dell'aiuto!