Autore Topic: Strana gestione del click di un bottone, necessito chiarimento  (Letto 835 volte)

Offline AndreaNobili

  • Utente junior
  • **
  • Post: 75
  • Respect: 0
    • Mostra profilo
Strana gestione del click di un bottone, necessito chiarimento
« il: 03 Agosto 2011, 18:25:21 CEST »
0
Ciao,
seguendo una guida ho sviluppato una semplicissima applicazione che ha 2 atività: MainActivity (l'attività principale) e SubActivity (un'attività secondaria che posso lanciare premendo un bottone dentro MainActivity)

Il codice della classe MainActivity è il seguente:

Codice: [Seleziona]
package mieapplicazioni.subactivitydemo;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity {

        /* Metodo chiamato appena viene creata l'attività principale */
        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);                                // Chiama il costruttore del supertipo
               
                Button button = new Button(this);                                // Crea un nuovo bottone
                button.setText("Lancia SubActivity");                        // Setta il testo del bottone appena creato
               
                button.setOnClickListener(new View.OnClickListener() {

                        @Override
                        public void onClick(View v) {
                                startSubActivity();
                        }
                });

                setContentView(button);
        }
       
        /* Metodo che fà partire la sotto attività */
        private void startSubActivity() {
                // Creo un nuovo intent passandogli il riferimento all'attività corrente ed il nome della sotto attività da avviare
                Intent intent = new Intent(this, SubActivity.class);
                startActivity(intent);                // Avvio l'attività
        }

}

In pratica nel metodo onCreate () (quindi alla creazione dell'attività principale) viene creato un bottone al quale viene assegnato un certo testo.
Il metodo startSubActivity() crea l'intent necessario ad avviare la sottoattività chiamata SubActtivity ed avvia tale sotto attività.

La cosa che mi sfugge e che non riesco a capire è perchè il metodo setOnclickListener() viene dichiarato così:

Codice: [Seleziona]
button.setOnClickListener(new View.OnClickListener() {

                        @Override
                        public void onClick(View v) {
                                startSubActivity();
                        }
                });

Non capisco cosa sia questa scrittura...lui chiama il meetodo setOnClickListener sull'oggetto button precedentemente costruito e gli passa un nuovo oggetto di tipo View.OnClickListener() e poi non capisco cosa faccia...

Qualcuno mi può illuminare sul cosa significhi e quale sia la logica? Credo che sia qualcosa di Java che non conosco...magari è una cavolata...

Grazie
Andrea

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Strana gestione del click di un bottone, necessito chiarimento
« Risposta #1 il: 03 Agosto 2011, 18:42:31 CEST »
0
Non c'è un perchè vero e proprio... si può fare.  :-P
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline AndreaNobili

  • Utente junior
  • **
  • Post: 75
  • Respect: 0
    • Mostra profilo
Re:Strana gestione del click di un bottone, necessito chiarimento
« Risposta #2 il: 03 Agosto 2011, 18:50:33 CEST »
0
Non c'è un perchè vero e proprio... si può fare.  :-P

ok...ma significherà qualcosa...che ne sò...è una classe interna o qualcosa del genere? dubito che sia una sintassi senza senso proprietaria di Android...credo che sia più che altro qualcosa di Java...credo...

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:Strana gestione del click di un bottone, necessito chiarimento
« Risposta #3 il: 03 Agosto 2011, 20:13:17 CEST »
+1
La sintassi è Java...poichè il framework Android è fatto in Java  :-P cosa ti sfugge ?

L'oggetto che passi è una interfaccia, il quale prevede l'implementazione del metodo onClick(View v)
Quando il Button viene premuto esegue (se è stato assegnato attraverso il setOnClickListener) tale metodo, dove al suo interno non vi è altro che il codice scritto da te.
E' esattamente come nel Java, pari pari.

Per fare un confronto con l'ambiente Java :

Codice (Java): [Seleziona]
JButton button = new JButton("Cliccami");
button.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent e)
    {
         // qui il tuo codice
     }
});

Come puoi vedere è esattamente la stessa cosa.
Se vuoi vedere quando avviene il "fire" dell'interfaccia puoi guardati il codice sorgente della classe View, ereditata indirettamente dalla classe Button : View.java

Offline AndreaNobili

  • Utente junior
  • **
  • Post: 75
  • Respect: 0
    • Mostra profilo
Re:Strana gestione del click di un bottone, necessito chiarimento
« Risposta #4 il: 04 Agosto 2011, 19:53:13 CEST »
0
La sintassi è Java...poichè il framework Android è fatto in Java  :-P cosa ti sfugge ?

L'oggetto che passi è una interfaccia, il quale prevede l'implementazione del metodo onClick(View v)
Quando il Button viene premuto esegue (se è stato assegnato attraverso il setOnClickListener) tale metodo, dove al suo interno non vi è altro che il codice scritto da te.
E' esattamente come nel Java, pari pari.

Per fare un confronto con l'ambiente Java :

Codice (Java): [Seleziona]
JButton button = new JButton("Cliccami");
button.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent e)
    {
         // qui il tuo codice
     }
});

Come puoi vedere è esattamente la stessa cosa.
Se vuoi vedere quando avviene il "fire" dell'interfaccia puoi guardati il codice sorgente della classe View, ereditata indirettamente dalla classe Button : View.java

Ok,
è esattamente quello che mi mancava...come avevo detto nel primo post sospettavo che si trattasse di un qualche costrutto Java che però mi mancava (ora che mi sono documentato dovrebbero chiamarsi tipo classi innestate anonime o qualcosa del genere, giusto?)

In pratica da quello che ho capito potrei anche crearmi una classe che implementa l'interfaccia e che a sua volta implementa il metodo onClick altrove e poi passargli il riferimento a tale oggetto...solo che sarebbe spreco di codice, ho capito bene?

Altra domandina probabilmente banale...cosa contiene e cosa rappresenta il parametro View v passato al metodo onClick?

Grazie
Andrea

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:Strana gestione del click di un bottone, necessito chiarimento
« Risposta #5 il: 04 Agosto 2011, 20:03:47 CEST »
0
Altra domandina probabilmente banale...cosa contiene e cosa rappresenta il parametro View v passato al metodo onClick?
La view cliccata..
Postate il LogCat LogCat LogCat LogCat LogCat

Offline AndreaNobili

  • Utente junior
  • **
  • Post: 75
  • Respect: 0
    • Mostra profilo
Re:Strana gestione del click di un bottone, necessito chiarimento
« Risposta #6 il: 04 Agosto 2011, 20:08:48 CEST »
0
La view cliccata..

ah in pratica semplicemente se ad esempio clicko su un bottone gli passa il riferimento a quel bottone?

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:Strana gestione del click di un bottone, necessito chiarimento
« Risposta #7 il: 05 Agosto 2011, 08:24:14 CEST »
0
ah in pratica semplicemente se ad esempio clicko su un bottone gli passa il riferimento a quel bottone?
Si. Nel tuo esempio specifico la view sarà sempre il bottone su cui hai implementato il listener.
Il parametro view diventa utile quando utilizzi lo stesso listener per più di una view.
Postate il LogCat LogCat LogCat LogCat LogCat