Android: Eventi e Listener

Quando sviluppiamo applicazioni Android, è essenziale gestire l’interazione dell’utente con l’interfaccia utente. Gli eventi e i listener sono il meccanismo principale per rilevare e rispondere a queste interazioni. In questo articolo, esploreremo come gestire i clic e altri eventi comuni.

Cos’è un evento?

Un evento rappresenta un’azione o un’interazione che si verifica nell’app, come:

  • Toccare uno schermo;
  • Premere un pulsante;
  • Trascinare un oggetto;
  • Cambiare il testo in un campo di input;

Android offre una varietà di eventi, ciascuno associato a specifici componenti dell’interfaccia.

Cos’è un listener?

Un listener è un oggetto che ascolta e risponde a un evento. Ad esempio, un OnClickListener è un listener utilizzato per gestire i clic su un pulsante.

Gestire il click: OnClickListener

Questo è il metodo più comune e consigliato per gestire i clic in un’app.

Esempio:

Button mioBottone = findViewById(R.id.mio_bottone);
mioBottone.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // Azione da eseguire al clic
        Toast.makeText(getApplicationContext(), "Bottone cliccato!", Toast.LENGTH_SHORT).show();
    }
});

Gestire il cambio di testo: TextWatcher

L’evento di cambio testo è utile, ad esempio, per validare i dati inseriti in tempo reale in un campo di testo.

Esempio:

EditText mioEditText = findViewById(R.id.mio_edittext);
mioEditText.addTextChangedListener(new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        // Prima che il testo cambi
    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        // Durante il cambiamento del testo
    }

    @Override
    public void afterTextChanged(Editable s) {
        // Dopo il cambiamento del testo
        Log.d("TextWatcher", "Testo attuale: " + s.toString());
    }
});

Gestire il long click: OnLongClickListener

Un long click si verifica quando l’utente tiene premuto un elemento per un certo tempo.

Esempio:

Button mioBottone = findViewById(R.id.mio_bottone);
mioBottone.setOnLongClickListener(new View.OnLongClickListener() {
    @Override
    public boolean onLongClick(View v) {
        // Azione da eseguire al long click
        Toast.makeText(getApplicationContext(), "Long click rilevato!", Toast.LENGTH_SHORT).show();
        return true; // Restituisci true per consumare l'evento
    }
});

Gestire il focus: OnFocusChangeListener

Questo evento si verifica quando una View guadagna o perde il focus.

Esempio:

EditText mioEditText = findViewById(R.id.mio_edittext);
mioEditText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (hasFocus) {
            Log.d("Focus", "EditText ha guadagnato il focus");
        } else {
            Log.d("Focus", "EditText ha perso il focus");
        }
    }
});

Conclusione

La gestione degli eventi e dei listener è una parte fondamentale nello sviluppo di app Android. Comprendere come funzionano ti permette di creare interfacce interattive e reattive. Inizia con eventi semplici come i clic e, man mano, esplora eventi più complessi come il cambio di testo o il focus per costruire esperienze utente coinvolgenti.

Video su YouTube

Codice completo

OnClickListener

  • activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    tools:context=".MainActivity">

   <Button
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="Cliccami"
       android:id="@+id/mioBottone"/>

</LinearLayout>
  • MainActivity.java
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;


import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;


public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_main);
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
            Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
            return insets;
        });

        Button mioBottone = findViewById(R.id.mioBottone);
        mioBottone.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(MainActivity.this,"Hai cliccato il bottone",Toast.LENGTH_SHORT).show();
            }
        });

    }
}

OnLongClickListener

  • activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    tools:context=".MainActivity">

   <Button
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="Cliccami"
       android:id="@+id/mioBottone"/>

</LinearLayout>
  • MainActivity.java
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;


import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;


public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_main);
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
            Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
            return insets;
        });

        Button mioBottone = findViewById(R.id.mioBottone);
        mioBottone.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                Toast.makeText(MainActivity.this,"Hai tenuto premuto il bottone",Toast.LENGTH_SHORT).show();
                return true;
            }
        });

    }
}

TextWatcher

  • activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    tools:context=".MainActivity">

   <EditText
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
      android:hint="Inserisci il tuo nome"
      android:inputType="text"
      android:id="@+id/input"/>

</LinearLayout>
  • MainActivity.java
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.widget.EditText;


import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;


public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_main);
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
            Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
            return insets;
        });

        EditText input = findViewById(R.id.input);
        input.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                Log.e("Testo","Testo prima che cambia: " + s);
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                Log.e("Testo","Testo durante il cambiamento: " + s);

            }

            @Override
            public void afterTextChanged(Editable s) {
                Log.e("Testo","Testo dopo il cambiamento: " + s);

            }
        });

    }
}

OnFocusChangeListener

  • activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    tools:context=".MainActivity">

   <EditText
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
      android:hint="Inserisci il tuo nome"
      android:inputType="text"
      android:id="@+id/input"/>

   <EditText
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:hint="Inserisci il tuo cognome"
       android:inputType="text"
      />


</LinearLayout>
  • MainActivity.java
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;


import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;


public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_main);
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
            Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
            return insets;
        });

        EditText input = findViewById(R.id.input);
       input.setOnFocusChangeListener(new View.OnFocusChangeListener() {
           @Override
           public void onFocusChange(View v, boolean hasFocus) {
               if(hasFocus){
                   Toast.makeText(MainActivity.this,"L'input ha il focus",Toast.LENGTH_SHORT).show();
               }else{
                   Toast.makeText(MainActivity.this,"L'input non ha il focus",Toast.LENGTH_SHORT).show();

               }
           }
       });

    }
}

Lascia una risposta

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Share via
Copy link
Verificato da MonsterInsights