Android - Gestione degli eventi

Events are a useful way to collect data about a user's interaction with interactive components of Applications.Come la pressione dei pulsanti o il tocco dello schermo, ecc. Il framework Android mantiene una coda di eventi come base FIFO (first-in, first-out). È possibile acquisire questi eventi nel programma e intraprendere le azioni appropriate in base ai requisiti.

Sono disponibili i tre concetti seguenti relativi alla gestione degli eventi Android:

  • Event Listeners- Un listener di eventi è un'interfaccia nella classe View che contiene un singolo metodo di callback. Questi metodi verranno chiamati dal framework Android quando la visualizzazione in cui è stato registrato il listener viene attivata dall'interazione dell'utente con l'elemento nell'interfaccia utente.

  • Event Listeners Registration - La registrazione dell'evento è il processo mediante il quale un gestore di eventi viene registrato con un listener di eventi in modo che il gestore venga chiamato quando il listener di eventi attiva l'evento.

  • Event Handlers - Quando si verifica un evento e abbiamo registrato un listener di eventi per l'evento, il listener di eventi chiama i gestori di eventi, che è il metodo che gestisce effettivamente l'evento.

Listener di eventi e gestori di eventi

Gestore di eventi Listener e descrizione dell'evento
al clic()

OnClickListener()

Questo viene chiamato quando l'utente fa clic o tocca o si concentra su qualsiasi widget come pulsante, testo, immagine, ecc. Utilizzerai il gestore di eventi onClick () per gestire tale evento.

onLongClick ()

OnLongClickListener()

Questo viene chiamato quando l'utente fa clic o tocca o si concentra su qualsiasi widget come pulsante, testo, immagine ecc. Per uno o più secondi. Utilizzerai il gestore di eventi onLongClick () per gestire tale evento.

onFocusChange ()

OnFocusChangeListener()

Questo viene chiamato quando il widget perde il suo focus, ad es. l'utente esce dall'elemento di visualizzazione. Utilizzerai il gestore di eventi onFocusChange () per gestire tale evento.

onKey ()

OnFocusChangeListener()

Viene chiamato quando l'utente è concentrato sull'elemento e preme o rilascia una chiave hardware sul dispositivo. Utilizzerai il gestore di eventi onKey () per gestire tale evento.

onTouch ()

OnTouchListener()

Viene chiamato quando l'utente preme il tasto, rilascia il tasto o qualsiasi gesto di movimento sullo schermo. Utilizzerai il gestore di eventi onTouch () per gestire tale evento.

onMenuItemClick ()

OnMenuItemClickListener()

Viene chiamato quando l'utente seleziona una voce di menu. Utilizzerai il gestore di eventi onMenuItemClick () per gestire tale evento.

onCreateContextMenu ()

onCreateContextMenuItemListener()

Viene chiamato quando viene creato il menu contestuale (come risultato di un "lungo clic prolungato)

Ci sono molti altri listener di eventi disponibili come parte di Viewclasse come OnHoverListener, OnDragListener ecc. che potrebbero essere necessari per l'applicazione. Quindi consiglio di fare riferimento alla documentazione ufficiale per lo sviluppo di applicazioni Android nel caso in cui si stia sviluppando un'app sofisticata.

Registrazione ascoltatori di eventi

La registrazione degli eventi è il processo mediante il quale un gestore di eventi viene registrato con un listener di eventi in modo che il gestore venga chiamato quando il listener di eventi attiva l'evento. Sebbene ci siano diversi modi complicati per registrare il tuo ascoltatore di eventi per qualsiasi evento, ma ho intenzione di elencare solo i primi 3 modi, tra i quali puoi usarli in base alla situazione.

  • Utilizzo di una classe interna anonima

  • La classe Activity implementa l'interfaccia Listener.

  • Utilizzo del file di layout activity_main.xml per specificare direttamente il gestore eventi.

La sezione sottostante fornirà esempi dettagliati su tutti e tre gli scenari:

Modalità touch

Gli utenti possono interagire con i propri dispositivi utilizzando tasti o pulsanti hardware o toccando lo schermo. Toccando lo schermo si mette il dispositivo in modalità touch. L'utente può quindi interagire con esso toccando i pulsanti virtuali sullo schermo, le immagini, ecc. È possibile verificare se il dispositivo è in modalità touch chiamando il metodo isInTouchMode () della classe View.

Messa a fuoco

Una vista o un widget viene solitamente evidenziato o mostra un cursore lampeggiante quando è attivo. Ciò indica che è pronto per accettare l'input dell'utente.

  • isFocusable() - restituisce vero o falso

  • isFocusableInTouchMode()- controlla se la vista è attivabile in modalità touch. (Una vista può essere attivabile quando si utilizza una chiave hardware ma non quando il dispositivo è in modalità touch)

android:foucsUp="@=id/button_l"

onTouchEvent ()

public boolean onTouchEvent(motionEvent event){
   switch(event.getAction()){
      case TOUCH_DOWN:
      Toast.makeText(this,"you have clicked down Touch button",Toast.LENTH_LONG).show();
      break();
   
      case TOUCH_UP:
      Toast.makeText(this,"you have clicked up touch button",Toast.LENTH_LONG).show();
      break;
   
      case TOUCH_MOVE:
      Toast.makeText(this,"you have clicked move touch button"Toast.LENTH_LONG).show();
      break;
   }
   return super.onTouchEvent(event) ;
}

Esempi di gestione degli eventi

Registrazione dei listener di eventi utilizzando una classe interna anonima

Qui creerai un'implementazione anonima del listener e sarà utile se ogni classe viene applicata a un solo controllo e hai il vantaggio di passare argomenti al gestore di eventi. In questo approccio, i metodi del gestore di eventi possono accedere ai dati privati ​​di Activity. Non è necessario alcun riferimento per chiamare ad Activity.

Ma se hai applicato il gestore a più di un controllo, dovresti tagliare e incollare il codice per il gestore e se il codice per il gestore è lungo, rende il codice più difficile da mantenere.

Di seguito sono riportati i semplici passaggi per mostrare come utilizzeremo una classe Listener separata per registrare e acquisire un evento clic. In modo simile puoi implementare il tuo listener per qualsiasi altro tipo di evento richiesto.

Passo Descrizione
1 Utilizzerai l'IDE di Android Studio per creare un'applicazione Android e denominarla come myapplication in un pacchetto com.example.myapplication come spiegato nel capitolo Hello World Example .
2 Modificare il file src / MainActivity.java per aggiungere listener e gestori di eventi clic per i due pulsanti definiti.
3 Modifica il contenuto del detault del file res / layout / activity_main.xml per includere i controlli dell'interfaccia utente Android.
4 Non è necessario dichiarare le costanti di stringa predefinite, Android Studio si prende cura delle costanti predefinite.
5 Esegui l'applicazione per avviare l'emulatore Android e verifica il risultato delle modifiche apportate nell'applicazione.

Di seguito è riportato il contenuto del file di attività principale modificato src/com.example.myapplication/MainActivity.java. Questo file può includere ciascuno dei metodi fondamentali del ciclo di vita.

package com.example.myapplication;

import android.app.ProgressDialog;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends ActionBarActivity {
   private ProgressDialog progress;
   Button b1,b2;

   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      progress = new ProgressDialog(this);

      b1=(Button)findViewById(R.id.button);
      b2=(Button)findViewById(R.id.button2);
      b1.setOnClickListener(new View.OnClickListener() {
         
         @Override
         public void onClick(View v) {
            TextView txtView = (TextView) findViewById(R.id.textView);
            txtView.setTextSize(25);
         }
      });

      b2.setOnClickListener(new View.OnClickListener() {
         
         @Override
         public void onClick(View v) {
            TextView txtView = (TextView) findViewById(R.id.textView);
            txtView.setTextSize(55);
         }
      });
   }
}

Di seguito sarà il contenuto di res/layout/activity_main.xml file -

Qui abc indica il logo tutorialspoint
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 
   xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:paddingBottom="@dimen/activity_vertical_margin"
   android:paddingLeft="@dimen/activity_horizontal_margin"
   android:paddingRight="@dimen/activity_horizontal_margin"
   android:paddingTop="@dimen/activity_vertical_margin"
   tools:context=".MainActivity">
   
   <TextView
      android:id="@+id/textView1"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Event Handling "
      android:layout_alignParentTop="true"
      android:layout_centerHorizontal="true"
      android:textSize="30dp"/>
      
   <TextView
      android:id="@+id/textView2"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Tutorials point "
      android:textColor="#ff87ff09"
      android:textSize="30dp"
      android:layout_above="@+id/imageButton"
      android:layout_centerHorizontal="true"
      android:layout_marginBottom="40dp" />
      
   <ImageButton
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:id="@+id/imageButton"
      android:src="@drawable/abc"
      android:layout_centerVertical="true"
      android:layout_centerHorizontal="true" />
      
   <Button
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Small font"
      android:id="@+id/button"
      android:layout_below="@+id/imageButton"
      android:layout_centerHorizontal="true" />
      
   <Button
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Large Font"
      android:id="@+id/button2"
      android:layout_below="@+id/button"
      android:layout_alignRight="@+id/button"
      android:layout_alignEnd="@+id/button" />
      
   <TextView
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Hello World!"
      android:id="@+id/textView"
      android:layout_below="@+id/button2"
      android:layout_centerHorizontal="true"
      android:textSize="25dp" />
      
</RelativeLayout>

Di seguito sarà il contenuto di res/values/strings.xml per definire due nuove costanti -

<?xml version="1.0" encoding="utf-8"?>
<resources>
   <string name="app_name">myapplication</string>
</resources>

Di seguito è riportato il contenuto predefinito di AndroidManifest.xml -

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.example.myapplication" >
      
   <application
      android:allowBackup="true"
      android:icon="@drawable/ic_launcher"
      android:label="@string/app_name"
      android:theme="@style/AppTheme" >
      
      <activity
         android:name="com.example.myapplication.MainActivity"
         android:label="@string/app_name" >
      
         <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
         </intent-filter>
      
      </activity>
      
   </application>
</manifest>

Proviamo a eseguire il tuo myapplicationapplicazione. Presumo che tu abbia creato il tuoAVDdurante l'impostazione dell'ambiente. Per eseguire l'app da Android Studio, apri uno dei file di attività del progetto e fai clic sull'icona Esegui dalla barra degli strumenti. Android Studio installa l'app sul tuo AVD e la avvia e se tutto va bene con la configurazione e l'applicazione, verrà visualizzata la seguente finestra dell'emulatore:

Ora provi a fare clic su due pulsanti, uno per uno e vedrai quel carattere del file Hello World il testo cambierà, il che accade perché il metodo del gestore dell'evento clic registrato viene chiamato per ogni evento clic.

Esercizio

Consiglierò di provare a scrivere gestori di eventi diversi per tipi di eventi diversi e di comprendere la differenza esatta nei tipi di eventi diversi e la loro gestione. Gli eventi relativi a menu, spinner, widget di selezione sono leggermente diversi ma si basano anche sugli stessi concetti spiegati sopra.