Android - obsługa zdarzeń
Events are a useful way to collect data about a user's interaction with interactive components of Applications.Podobnie jak naciśnięcie przycisku lub dotknięcie ekranu itp. Struktura systemu Android utrzymuje kolejkę zdarzeń na zasadzie FIFO (pierwsze weszło, pierwsze wyszło). Możesz uchwycić te zdarzenia w swoim programie i podjąć odpowiednie działania zgodnie z wymaganiami.
Istnieją trzy koncepcje związane z zarządzaniem zdarzeniami Androida:
Event Listeners- Detektor zdarzeń to interfejs w klasie View, który zawiera pojedynczą metodę wywołania zwrotnego. Te metody będą wywoływane przez platformę systemu Android, gdy widok, do którego został zarejestrowany odbiornik, zostanie wyzwolony przez interakcję użytkownika z elementem w interfejsie użytkownika.
Event Listeners Registration - Rejestracja zdarzenia to proces, w którym program obsługi zdarzeń zostaje zarejestrowany w detektorze zdarzeń, dzięki czemu procedura obsługi jest wywoływana, gdy detektor zdarzeń wyzwala zdarzenie.
Event Handlers - Kiedy zdarzenie ma miejsce i zarejestrowaliśmy detektor zdarzenia dla zdarzenia, detektor zdarzenia wywołuje Event Handlers, czyli metodę, która faktycznie obsługuje zdarzenie.
Detektory zdarzeń i programy obsługi zdarzeń
Obsługa zdarzeń | Odbiornik i opis wydarzeń |
---|---|
na kliknięcie() | OnClickListener() Jest to wywoływane, gdy użytkownik kliknie, dotknie lub skupi się na dowolnym widżecie, takim jak przycisk, tekst, obraz itp. Będziesz używać modułu obsługi zdarzenia onClick () do obsługi takiego zdarzenia. |
onLongClick () | OnLongClickListener() Jest to wywoływane, gdy użytkownik kliknie, dotknie lub skupi się na dowolnym widżecie, takim jak przycisk, tekst, obraz itp. Przez jedną lub więcej sekund. Będziesz używać modułu obsługi zdarzeń onLongClick () do obsługi takiego zdarzenia. |
onFocusChange () | OnFocusChangeListener() Jest to wywoływane, gdy widget traci swoją aktywność, np. użytkownik odchodzi od widoku elementu. Będziesz używać procedury obsługi zdarzeń onFocusChange () do obsługi takiego zdarzenia. |
onKey () | OnFocusChangeListener() Jest to wywoływane, gdy użytkownik koncentruje się na elemencie i naciska lub zwalnia klucz sprzętowy na urządzeniu. Będziesz używać modułu obsługi zdarzeń onKey () do obsługi takiego zdarzenia. |
w dotyku() | OnTouchListener() Jest to wywoływane, gdy użytkownik naciśnie klawisz, zwolni klawisz lub jakikolwiek ruch na ekranie. Będziesz używać modułu obsługi zdarzeń onTouch () do obsługi takiego zdarzenia. |
onMenuItemClick () | OnMenuItemClickListener() Jest to wywoływane, gdy użytkownik wybierze pozycję menu. Będziesz używać procedury obsługi zdarzeń onMenuItemClick () do obsługi takiego zdarzenia. |
onCreateContextMenu () | onCreateContextMenuItemListener() Jest to wywoływane, gdy budowane jest menu kontekstowe (w wyniku ciągłego „długiego kliknięcia”) |
W ramach programu dostępnych jest znacznie więcej detektorów zdarzeń Viewklasa, taka jak OnHoverListener, OnDragListener itp., która może być potrzebna dla twojej aplikacji. Dlatego polecam zapoznać się z oficjalną dokumentacją dotyczącą tworzenia aplikacji na Androida na wypadek, gdybyś miał zamiar tworzyć zaawansowane aplikacje.
Rejestracja słuchaczy zdarzeń
Rejestracja zdarzenia to proces, w którym program obsługi zdarzeń zostaje zarejestrowany w detektorze zdarzeń, dzięki czemu procedura obsługi jest wywoływana, gdy detektor zdarzeń wyzwala zdarzenie. Chociaż istnieje kilka trudnych sposobów zarejestrowania nasłuchiwania wydarzeń dla dowolnego wydarzenia, wymienię tylko 3 najlepsze sposoby, z których możesz użyć dowolnego z nich w zależności od sytuacji.
Korzystanie z anonimowej klasy wewnętrznej
Klasa Activity implementuje interfejs Listener.
Użycie pliku układu activity_main.xml do bezpośredniego określenia obsługi zdarzeń.
Poniższa sekcja zawiera szczegółowe przykłady dotyczące wszystkich trzech scenariuszy -
Tryb dotykowy
Użytkownicy mogą wchodzić w interakcje ze swoimi urządzeniami za pomocą klawiszy lub przycisków sprzętowych lub dotykając ekranu. Dotknięcie ekranu przełącza urządzenie w tryb dotykowy. Użytkownik może następnie wchodzić z nim w interakcję, dotykając wirtualnych przycisków na ekranie, obrazów itp. Możesz sprawdzić, czy urządzenie jest w trybie dotykowym, wywołując metodę isInTouchMode () klasy View.
Skupiać
Widok lub widżet jest zwykle podświetlony lub wyświetla migający kursor, gdy jest aktywny. Oznacza to, że jest gotowy do przyjęcia danych wejściowych od użytkownika.
isFocusable() - zwraca prawdę lub fałsz
isFocusableInTouchMode()- sprawdza, czy można ustawić ostrość widoku w trybie dotykowym. (Widok można ustawić za pomocą klawisza sprzętowego, ale nie, gdy urządzenie jest w trybie dotykowym)
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) ;
}
Przykłady obsługi zdarzeń
Rejestracja detektorów zdarzeń przy użyciu anonimowej klasy wewnętrznej
Tutaj utworzysz anonimową implementację nasłuchiwania i będzie przydatna, jeśli każda klasa zostanie zastosowana tylko do jednej kontrolki i masz przewagę w przekazywaniu argumentów do programu obsługi zdarzeń. W tym podejściu metody obsługi zdarzeń mogą uzyskać dostęp do prywatnych danych działania. Do wywołania działania nie jest potrzebne żadne odniesienie.
Ale jeśli zastosowałeś procedurę obsługi do więcej niż jednej kontrolki, będziesz musiał wyciąć i wkleić kod dla procedury obsługi, a jeśli kod procedury obsługi jest długi, utrudnia to utrzymanie kodu.
Poniżej przedstawiono proste kroki, aby pokazać, w jaki sposób wykorzystamy oddzielną klasę Listener do rejestrowania i przechwytywania zdarzenia kliknięcia. W podobny sposób możesz zaimplementować odbiornik dla dowolnego innego wymaganego typu zdarzenia.
Krok | Opis |
---|---|
1 | Użyjesz Android Studio IDE do stworzenia aplikacji na Androida i nazwij ją jako myapplication w pakiecie com.example.myapplication, jak wyjaśniono w rozdziale Hello World Example . |
2 | Zmodyfikuj plik src / MainActivity.java , aby dodać detektory i procedury obsługi zdarzeń kliknięcia dla dwóch zdefiniowanych przycisków. |
3 | Zmodyfikuj ukrytą zawartość pliku res / layout / activity_main.xml , aby uwzględnić elementy sterujące interfejsu użytkownika systemu Android. |
4 | Nie ma potrzeby deklarowania domyślnych stałych łańcuchowych, Android studio dba o domyślne stałe. |
5 | Uruchom aplikację, aby uruchomić emulator Androida i zweryfikować wynik zmian dokonanych w aplikacji. |
Poniżej znajduje się zawartość zmodyfikowanego pliku głównego działania src/com.example.myapplication/MainActivity.java. Ten plik może zawierać każdą z podstawowych metod cyklu życia.
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);
}
});
}
}
Poniżej będzie treść res/layout/activity_main.xml plik -
Tutaj abc wskazuje na 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>
Poniżej będzie treść res/values/strings.xml zdefiniować dwie nowe stałe -
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">myapplication</string>
</resources>
Poniżej znajduje się domyślna zawartość 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>
Spróbujmy uruchomić Twój myapplicationpodanie. Zakładam, że stworzyłeś swójAVDpodczas konfigurowania środowiska. Aby uruchomić aplikację z Android Studio, otwórz jeden z plików aktywności projektu i kliknij
Teraz spróbuj kliknąć dwa przyciski, jeden po drugim, a zobaczysz tę czcionkę Hello World tekst ulegnie zmianie, co dzieje się, ponieważ zarejestrowana metoda obsługi zdarzenia kliknięcia jest wywoływana przy każdym zdarzeniu kliknięcia.
Ćwiczenie
Polecę napisanie różnych programów obsługi zdarzeń dla różnych typów zdarzeń i zrozumienie dokładnych różnic w różnych typach zdarzeń i ich obsłudze. Wydarzenia związane z menu, pokrętłem, widżetami zbieraczy są trochę inne, ale są również oparte na tych samych koncepcjach, co wyjaśniono powyżej.