Gestione degli eventi
I widget di Android descritti nel "primo" documento sono tutti dotati di una serie di metodi di callback che hanno nomi nella forma onTipoEvento(). Questi metodi sono richiamati ogni volta che il corrispondente evento si verifica sul widget. Ad esempio, la classe android.widget.Button() è dotata del metodo onTouchEvent(). Il suddetto metodo è eseguito ogni qualvolta il bottone è premuto dall'utente.
Tali eventi possono essere ridefiniti dallo sviluppatore (ad esempio per visualizzare dei toast in fase di debugging) creando una nuova classe che estende quella di partenza. Ad esempio:
public class MyButton extends Button {
public MyButton(Context context) {
super(context);
} // costruttore
public boolean onTouchEvent(MotionEvent event) {
super.onTouchEvent(event); // gestione grafica
int action = event.getAction();
if(action == MotionEvent.ACTION_DOWN) {
Toast toast = Toast.makeText(getContext(), "Bottone cliccato!", Toast.LENGTH_SHORT);
toast.show();
return true;
}
return false;
}
}
La ridefinizione dei metodi di callback è una tecnica funzionante ma poco pratica, poiché occorre ridefinire una nuova classe per ogni widget utilizzato. Questo metodo, infatti, è utile quasi esclusivamente quando si vuole creare dei propri componenti custom.
Metodi setOnTipoEventoListener()
Tutti i widget, però, mettono a disposizione un'altra serie di metodi, del tipo setOnTipoEventoListener(). Attraverso questa tipologia di metodi si possono "affiancare" al widget dei listener di eventi, istanze di classi particolari che hanno il preciso scopo di ricevere le notifiche di vari eventi (ad esempio il tocco su un bottone).
Per ciascun differente tipo di listener esiste un'apposita interfaccia Java che lo sviluppatore dovrà creare per gestire il proprio evento. Ad esempio, l'interfaccia per gli eventi di click è:
android.view.View.OnClickListener
Nel caso specifico, il metodo da ridefinire è:
public abstract void onClick(View v);
Esempio di implementazione
package corso.test;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Toast;
public class MyClickListener implements OnClickListener {
public void onClick(View view) {
Toast toast = Toast.makeText(view.getContext(), "Bottone cliccato!", Toast.LENGTH_SHORT);
toast.show();
}
}
package corso.test;
import android.app.Activity;
import android.os.Bundle;
import android.view.Gravity;
import android.widget.Button;
import android.widget.LinearLayout;
public class MainActivity extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Button button = new Button(this);
button.setText("Premi");
button.setOnClickListener(new MyClickListener());
LinearLayout layout = new LinearLayout(this);
layout.setGravity(Gravity.CENTER);
layout.addView(button);
setContentView(layout);
}
…
}
Riduzione del codice
Per la gestione degli eventi, inoltre, è possibile ridurre le righe di codice necessarie in alcuni modi:
- Qualunque classe può diventare un listener senza necessariamente scriverne di nuove
- Usando lo stesso listener di evento per più widget
- Usare classi anonime
Ad esempio, la stessa classe MainActivity potrebbe implementare OnClickListener, ridefinendo all'interno della classe il metodo public void onClick(View v). Presupponendo di utilizzare due bottoni differenti, il suddetto metodo potrebbe eseguire del codice differente a seconda del bottone schiacciato.
Oppure, è possibile utilizzare classi anonime, come nel seguente esempio:
Eventi gestibili sui widget
I principali eventi gestibili sui widget sono:
- Click: metodo setOnClickListener() con metodo da ridefinire onClick(View view) il cui parametro è il widget.
-
Studio di usabilità in portali di Event Management - Tesi di laurea di II livello
-
Tesi di laurea Progettazione e implementazione di un sistema per il tracciamento di oggetti in movimento basato su …
-
Appunti Seminari Android - iOS
-
Laboratorio di progettazione di applicazioni Android