back to top

Gestione degli eventi in Android Studio

Nelle lezioni precedenti abbiamo utilizzato eventi, come il click su un button, per effettuare determinate attività. Adesso è il momento di comprendere meglio come funzionano gli eventi su Android. Essi possono essere utilizzati in diversi modi, ma generalmente vengono utilizzati in risposta ad un’azione esterna. Quelli più comuni su dispositivi come tablet e smartphone riguardano l’interazione con il touch screen e sono categorizzati come eventi di input.

Il framework Android mantiene una coda di eventi in cui essi vengono posti man mano che si verificano e dalla quale vengono rimossi in modalità FIFO (first-in, first-out), quindi in ordine cronologico dal più vecchio. In caso di un evento di input, come un tocco sullo schermo, l’evento viene passato alla vista (ad esempio un button) posizionata nel punto in cui lo schermo viene toccato. In aggiunta alla notifica dell’evento la vista riceve anche un insieme di informazioni che dipendono dal tipo di evento, come ad esempio le coordinate del punto di contatto tra il dito dell’utente e lo schermo.

Per la gestione degli eventi una vista deve disporre di un cosiddetto event listener (letteralmente ascoltatore di eventi), un oggetto che riceve una notifica quando si verifica un evento. La classe Android View, dalla quale derivano tutti i componenti che possono essere presenti in un’interfaccia utente, contiene un certo numero di interfacce relative ad event listener ognuna delle quali contiene poi una dichiarazione per un cosiddetto metodo callback. Un metodo di questo tipo è in genere una funzione che viene passata come parametro ad un’altra funzione.

Per capire meglio facciamo un esempio. Se un button deve rispondere ad un evento click esso deve registrare l’event listener View.onClickListener ed implementare il metodo callback onClick. Nel momento in cui si verifica effettivamente la pressione del button, il framework Android richiama il metodo onClick di tale vista e l’evento viene rimosso dalla coda degli eventi. All’interno del metodo onClick deve essere poi inserito il codice da eseguire in risposta all’evento di pressione del button, cosa che abbiamo visto in vari esempi di lezioni precedenti.

Supponiamo dunque di avere un’interfaccia costituita da un button denominato button1 con il requisito che quando l’utente lo preme venga richiamato un metodo chiamato buttonClick. Tutto quello da fare per implementare questo comportamento è scrivere il codice del metodo buttonClick ed aggiungere una linea di codice che fa riferimento a tale metodo all’interno della dichiarazione del button nel relativo file XML

<Button
    android:id="@+id/button1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="buttonClick"
    android:text="Clicca qui" />

Vedremo successivamente un esempio pratico di applicazione di questi concetti. Prima però ritengo che sia il caso di dare un’occhiata agli event listener presenti all’interno del framework Android ed ai relativi metodi callback ad essi associati:

onClickListener – Utilizzato per individuare eventi di tipo click in cui l’utente tocca e rilascia un’area del dispositivo occupata da una vista e determina la chiamata al metodo onClick della vista.

onLongClickListener – Utilizzato per riscontare quando l’utente mantiene il tocco su una vista per un periodo più lungo del semplice click e determina la chiamata al metodo onLongClick.

onTouchListener – Utilizzato per individuare qualsiasi forma di contatto con lo schermo, inclusi tocchi multipli, e determina la chiamata al metodo onTouch.

onCreateContextMenuListener – Utilizzato per la creazione di un menù contestuale come conseguenza di un tocco prolungato e determina la chiamata al metodo onCreateContextMenu.

onFocusChangeListener – Utilizzato per determinare quando il focus si sposta dalla vista corrente come risultato dell’interazione con una track-ball o pulsante di navigazione e determina la chiamata al metodo onFocusChange.

onKeyListener – Utilizzato per determinare quando un pulsante sul dispositivo viene premuto mentre una determinata vista ha il focus e determina le chiamata al metodo onKey.

Nella parte restante della presente lezione ci dedicheremo alla creazione di un semplice progetto per testare l’implementazione di un event listener e del corrispondente metodo callback per determinare quando un utente clicca su un button. Nel metodo callback andremo semplicemente ad aggiornare una textview per indicare che l’evento si è verificato.

Avviamo dunque Android Studio e creiamo un nuovo progetto denominato TestEventi. Modifichiamo il file activity_main.xml inserendo il seguente codice

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/myLayout"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <Button
        android:id="@+id/myButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:text="Clicca qui" />

    <TextView
        android:id="@+id/myTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@+id/myButton"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="41dp"
        android:text="Stato"
        android:textAppearance="?android:attr/textAppearanceLarge" />

</RelativeLayout>

Tale codice corrisponde alla seguente interfaccia

Per gli scopi della presente lezione dobbiamo registrare per la view myButton un onClickListener. Questo si ottiene effettuando una chiamata al metodo setOnClickListener del button, passando attraverso un nuovo oggetto onClickListener come argomento ed implementando il metodo callback onClick. Siccome si tratta di un’operazione da effettuare nel momento in cui l’activity viene creata è buona norma inserire tale codice all’interno del metodo onCreate della classe MainActivity.java

package com.example.test.testeventi;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button = (Button)findViewById(R.id.myButton);

        button.setOnClickListener(
                new Button.OnClickListener() {
                    public void onClick(View v) {

                    }
                }
        );
    }

}

Con il codice precedente abbiamo dunque registrato l’event listener ed implementato il metodo onClick. Se eseguiamo l’applicazione adesso non avremo indicazioni sul corretto funzionamento o meno di questo listener perché il metodo onClick non fa nulla. Inseriamo allora all’interno del metodo onClick il codice che cada ad impostare un messaggio nella textview

public void onClick(View v) {
TextView myTextView = 
(TextView)findViewById(R.id.myTextView);
myTextView.setText("Ho cliccato!");
}

A questo punto avviamo l’applicazione

Cliccando sul button il risultato dovrebbe essere il seguente

Pubblicitร