Unter Android gibt es mehrere Möglichkeiten, die Ereignisse aus der Interaktion eines Nutzers mit Ihrer App abzufangen. Wenn Sie die Ereignisse in Ihrer Benutzeroberfläche betrachten, besteht der Ansatz darin, die Ereignisse aus dem spezifischen View-Objekt, mit dem der Nutzer interagiert. Die View-Klasse bietet die Möglichkeit dazu.
In den verschiedenen View-Klassen, die Sie zum Erstellen Ihres Layouts verwenden, sehen Sie möglicherweise mehrere öffentliche Callbacks
die für UI-Ereignisse nützlich sind. Diese Methoden werden vom Android-Framework aufgerufen, wenn der
für das Objekt ausgeführt wird. Wenn beispielsweise eine Ansicht (etwa eine Schaltfläche) berührt wird,
wird die Methode onTouchEvent()
für dieses Objekt aufgerufen. Um dies abzufangen, müssen Sie jedoch
und die Methode überschreiben. Wenn Sie jedoch jedes View-Objekt erweitern,
um ein solches Ereignis zu bewältigen. Aus diesem Grund enthält die View-Klasse auch
eine Sammlung verschachtelter Schnittstellen mit Callbacks, die Sie viel einfacher definieren können. Diese Schnittstellen,
Event-Listener, ermöglichen es Ihnen, die Nutzerinteraktion mit Ihrer UI zu erfassen.
Obwohl Sie häufiger die Event-Listener verwenden, um auf Nutzerinteraktionen zu warten, gibt es möglicherweise
wenn Sie eine View-Klasse erweitern möchten, um eine benutzerdefinierte Komponente zu erstellen.
Vielleicht möchten Sie die Button
verlängern
Klasse etwas Schöneres zu machen. In diesem Fall können Sie das Standardverhalten für Ereignisse für Ihre
event-Handler.
Ereignis-Listener
Ein Event-Listener ist eine Schnittstelle in der Klasse View
, die ein einzelnes
. Diese Methoden werden vom Android-Framework aufgerufen, wenn die View, zu der der Listener gehört,
registriert wurde, durch eine Nutzerinteraktion mit dem Artikel auf der Benutzeroberfläche.
In den Ereignis-Listener-Oberflächen sind folgende Callback-Methoden enthalten:
onClick()
- Ab
View.OnClickListener
. Wird aufgerufen, wenn der Nutzer das Element berührt (im Touch-Modus) oder fokussiert sich mit den Navigationstasten oder dem Trackball und die entsprechende Eingabetaste drücken, drücken oder den Trackball nach unten drücken. onLongClick()
- Ab
View.OnLongClickListener
. Dies wird aufgerufen, wenn der Nutzer das Element berührt und hält (im Touchmodus) oder konzentriert sich auf das Element mit den Navigationstasten oder dem Trackball und und hält die entsprechende Taste oder den Trackball gedrückt halten (eine Sekunde lang). onFocusChange()
- Ab
View.OnFocusChangeListener
. Dieses wird aufgerufen, wenn der Nutzer mithilfe der Navigationstasten oder des Trackballs zum oder von dem Element navigiert. onKey()
- Ab
View.OnKeyListener
. Dieser wird aufgerufen, wenn sich der Nutzer auf den Artikel konzentriert und einen Hardwareschlüssel auf dem Gerät drückt oder wieder loslässt. onTouch()
- Ab
View.OnTouchListener
. Dieses Ereignis wird aufgerufen, wenn der Nutzer eine Aktion durchführt, die als Touch-Ereignis qualifiziert ist, z. B. Drücken, Loslassen, oder eine Bewegungsgeste auf dem Bildschirm (innerhalb der Grenzen des Elements). onCreateContextMenu()
- Ab
View.OnCreateContextMenuListener
. Dieses wird aufgerufen, wenn ein Kontextmenü erstellt wird (infolge eines andauernden "langen Klicks"). Diskussion ansehen zu Kontextmenüs in den Menüs Entwicklerleitfaden.
Diese Methoden sind die einzigen Bewohner ihrer jeweiligen Benutzeroberfläche. Um eine dieser Methoden zu definieren,
und Ihre Ereignisse verarbeiten, implementieren Sie die verschachtelte Schnittstelle in Ihrer Activity-Klasse oder definieren sie als anonyme Klasse.
Übergeben Sie dann eine Instanz Ihrer Implementierung,
an die entsprechende View.set...Listener()
-Methode an. (Beispiel: Anruf
und übergeben Sie Ihre Implementierung von setOnClickListener()
OnClickListener
.)
Das folgende Beispiel zeigt, wie ein On-Click-Listener für eine Schaltfläche registriert wird.
Kotlin
protected void onCreate(savedValues: Bundle) { ... val button: Button = findViewById(R.id.corky) // Register the onClick listener with the implementation above button.setOnClickListener { view -> // do something when the button is clicked } ... }
Java
// Create an anonymous implementation of OnClickListener private OnClickListener corkyListener = new OnClickListener() { public void onClick(View v) { // do something when the button is clicked } }; protected void onCreate(Bundle savedValues) { ... // Capture our button from layout Button button = (Button)findViewById(R.id.corky); // Register the onClick listener with the implementation above button.setOnClickListener(corkyListener); ... }
Möglicherweise finden Sie es auch praktischer, OnClickListener als Teil Ihrer Activity zu implementieren. Dadurch werden zusätzliche Klassenlasten und Objektzuweisungen vermieden. Beispiel:
Kotlin
class ExampleActivity : Activity(), OnClickListener { protected fun onCreate(savedValues: Bundle) { val button: Button = findViewById(R.id.corky) button.setOnClickListener(this) } // Implement the OnClickListener callback fun onClick(v: View) { // do something when the button is clicked } }
Java
public class ExampleActivity extends Activity implements OnClickListener { protected void onCreate(Bundle savedValues) { ... Button button = (Button)findViewById(R.id.corky); button.setOnClickListener(this); } // Implement the OnClickListener callback public void onClick(View v) { // do something when the button is clicked } ... }
Beachten Sie, dass der onClick()
-Callback im obigen Beispiel eine
keinen Rückgabewert. Einige andere Event-Listener-Methoden müssen jedoch einen booleschen Wert zurückgeben. Der Grund
hängt vom Ereignis ab. Hier der Grund für die wenigen, die dies tun:
– Daraufhin wird ein boolescher Wert zurückgegeben, der angibt, ob das Ereignis verarbeitet wurde und nicht weiter getragen werden soll. Das heißt, die Rückgabe von true gibt an, dass Sie das Ereignis verarbeitet haben und es hier beendet werden sollte: Geben Sie false zurück, wenn Sie das Ereignis noch nicht verarbeitet haben und/oder das Ereignis an einem anderen Tag fortgesetzt werden soll. die als Zuhörer aktiviert sind.onLongClick()
– Daraufhin wird ein boolescher Wert zurückgegeben, der angibt, ob das Ereignis verarbeitet wurde und nicht weiter getragen werden soll. Das heißt, die Rückgabe von true gibt an, dass Sie das Ereignis verarbeitet haben und es hier beendet werden sollte: Geben Sie false zurück, wenn Sie das Ereignis noch nicht verarbeitet haben und/oder das Ereignis an einem anderen Tag fortgesetzt werden soll. direkt zuhören.onKey()
– Es wird ein boolescher Wert zurückgegeben, der angibt, ob Ihr Listener dieses Ereignis verarbeitet. Wichtig ist, dass Sie kann dieses Ereignis mehrere aufeinanderfolgende Aktionen haben. Wenn Sie also false zurückgeben, Aktionen empfangen, geben Sie an, dass Sie das Ereignis nicht verarbeitet haben und kein Interesse an weiteren Aktionen aus diesem Ereignis haben. Daher werden Sie keine weiteren Aktionen ausführen. innerhalb des Ereignisses, wie z. B. eine Fingergeste oder das letztendliche Aufwärtsaktionsereignis.onTouch()
Hardware-Schlüsselereignisse werden immer in der aktuell ausgewählten Ansicht bereitgestellt. Sie werden von oben nach oben gesendet.
der View-Hierarchie und dann nach unten, bis sie das gewünschte Ziel erreicht haben. Wenn Ihre Datenansicht (oder ein untergeordnetes Element Ihrer Datenansicht)
der Fokus liegt, können Sie sich die Reise mit der
-Methode ansehen. Anstatt Schlüsselereignisse über die Ansicht zu erfassen, können Sie auch
alle Ereignisse in deinen Aktivitäten mit dispatchKeyEvent()
und onKeyDown()
.onKeyUp()
Denken Sie bei der Texteingabe für Ihre App auch daran, dass viele Geräte nur über Software-Eingaben verfügen.
. Solche Methoden müssen nicht schlüsselbasiert sein. einige nutzen Spracheingabe, Handschrift usw. Selbst wenn
eine Eingabemethode eine tastaturartige Oberfläche bietet, löst sie in der Regel nicht den Befehl
. Sie sollten niemals
Sie können eine Benutzeroberfläche erstellen, die bestimmte Tastenbetätigungen erfordert, sofern Sie Ihre Anwendung nicht auf Geräte beschränken möchten.
mit einer Hardwaretastatur. Verlassen Sie sich insbesondere nicht auf diese Methoden, um Eingaben zu validieren, wenn der Nutzer das Symbol
Return-Key; Verwenden Sie stattdessen Aktionen wie onKeyDown()
IME_ACTION_DONE
, um das Ereignis
-Eingabemethode ändern, wie Ihre App reagiert, sodass sie ihre Benutzeroberfläche auf sinnvolle Weise verändern kann. Annahmen vermeiden
wie eine Software-Eingabemethode funktionieren sollte, und vertrauen Sie einfach darauf, dass sie bereits formatierten Text für Ihre Anwendung zur Verfügung stellt.
Hinweis:Android ruft zuerst Event-Handler und dann die entsprechenden Standard- aus der Klassendefinition. Daher wird die Rückgabe von true von diesen Ereignis-Listenern beendet die Weitergabe des Ereignisses an andere Ereignis-Listener. Außerdem wird der Callback an den Ereignis-Listener blockiert. Standard-Event-Handler in der Ansicht. Wenn Sie true zurückgeben, sollten Sie also sicher sein, dass Sie das Ereignis beenden möchten.
Event-Handler
Wenn Sie eine benutzerdefinierte Komponente über die Ansicht "Ansicht" erstellen, können Sie mehrere Callback-Methoden definieren. Standard-Event-Handler verwendet. Im Dokument über Benutzerdefiniert Komponenten ansehen sehen Sie sich einige Callbacks an, die häufig für die Ereignisverarbeitung verwendet werden. einschließlich:
: Wird beim Eintreten eines neuen Schlüsselereignisses aufgerufen.onKeyDown(int, KeyEvent)
: Wird beim Eintreten eines Schlüsselereignisses aufgerufen.onKeyUp(int, KeyEvent)
: Wird bei einem Trackball-Bewegungsereignis aufgerufen.onTrackballEvent(MotionEvent)
– Wird bei einem Bewegungsereignis auf dem Touchscreen aufgerufen.onTouchEvent(MotionEvent)
: Wird aufgerufen, wenn der Aufruf zunimmt oder entfernt wird.onFocusChanged(boolean, int, Rect)
Es gibt noch einige andere Methoden, die nicht zur View-Klasse gehören. aber sich direkt darauf auswirken können, wie Sie mit Ereignissen umgehen. Wenn Sie also komplexere Ereignisse eines Layouts sollten Sie diese anderen Methoden in Betracht ziehen:
: So kann deinActivity.dispatchTouchEvent(MotionEvent)
Activity
alle Berührungsereignisse abfangen, bevor sie an das Fenster gesendet werden.
: Dadurch kann einViewGroup.onInterceptTouchEvent(MotionEvent)
ViewGroup
Ereignisse ansehen, sobald sie an untergeordnete Datenansichten gesendet werden.
– Call-to-Action bei einer übergeordneten Datenansicht, um anzugeben, dass sie keine Touch-Events mitViewParent.requestDisallowInterceptTouchEvent(boolean)
abfangen soll.onInterceptTouchEvent(MotionEvent)
Touch-Modus
Wenn Nutzende eine Benutzeroberfläche mit Richtungstasten oder einem Trackball verwenden, notwendig, um umsetzbare Elemente wie Schaltflächen hervorzuheben, damit die Nutzenden was Eingaben akzeptiert. Wenn das Gerät jedoch über Touchfunktionen verfügt und der Nutzer Interaktion mit der Oberfläche durch Berühren beginnt, ist es nicht mehr erforderlich, Elemente hervorheben oder eine bestimmte Ansicht hervorheben. Es gibt also einen Modus, Interaktion namens „Touch-Modus“.
Bei einem berührungsfähigen Gerät wird das Gerät, sobald die nutzende Person den Bildschirm berührt hat,
wechselt in den Touch-Modus. Ab diesem Zeitpunkt sind nur noch Datenansichten verfügbar, für die
„isFocusableInTouchMode()
“ ist fokussierbar, z. B. Widgets zur Textbearbeitung.
Andere Ansichten, die angetippt werden können, wie z. B. Schaltflächen, werden beim Berühren nicht hervorgehoben. wird er:
einfach ihre Zuhörer auslösen, wenn sie gedrückt halten.
Jedes Mal, wenn ein Nutzer auf eine Richtungstaste drückt oder mit einem Trackball scrollt, wird das Gerät den Touch-Modus zu beenden und eine Ansicht zu finden Jetzt kann der Nutzer die Interaktion mit der Benutzeroberfläche interagieren, ohne den Bildschirm zu berühren.
Der Touch-Modus wird im gesamten System (alle Fenster und Aktivitäten) beibehalten.
Um den aktuellen Status abzufragen, können Sie
isInTouchMode()
, um zu sehen, ob sich das Gerät derzeit im Touchmodus befindet.
Fokus auf Handhabung
Das Framework übernimmt die routinemäßige Fokusbewegung als Reaktion auf die Eingabe der Nutzenden.
Beispielsweise kann der Fokus geändert werden, wenn Ansichten entfernt, ausgeblendet oder neu erstellt werden
Ansichten werden verfügbar. Die Aufrufe zeigen, dass sie bereit sind, sich auf das zu konzentrieren,
mit der Methode
. Um festzulegen, ob eine Ansicht
isFocusable()
anrufen. Im Touchmodus
Sie können mit setFocusable()
abfragen, ob eine Ansicht den Fokus zulässt.
Sie können dies mit isFocusableInTouchMode()
ändern.
setFocusableInTouchMode()
Auf Geräten mit Android 9 (API-Level 28) oder höher wird für Aktivitäten kein Fokus liegt. Stattdessen müssen Sie bei Bedarf den anfänglichen Fokus explizit anfordern.
Fokusbewegung basiert auf einem Algorithmus, der den nächsten Nachbarn in einem Richtung gegeben haben. In seltenen Fällen kann es vorkommen, dass der Standardalgorithmus nicht mit dem beabsichtigten Verhaltens des Entwicklers. In diesen Fällen können Sie explizite Überschreibungen mit den folgenden XML-Attributen in der Layoutdatei: nextFocusDown, nextFocusLeft, nextFocusRight und nextFocusUp. Fügen Sie der Datenansicht aus die folgenden Attribute hinzu: der Fokus geht. Legen Sie den Wert des Attributs als ID der Datenansicht fest. auf den der Fokus gesetzt werden soll. Beispiel:
<LinearLayout android:orientation="vertical" ... > <Button android:id="@+id/top" android:nextFocusUp="@+id/bottom" ... /> <Button android:id="@+id/bottom" android:nextFocusDown="@+id/top" ... /> </LinearLayout>
Bei diesem vertikalen Layout wäre das Navigieren von der ersten Schaltfläche und auch nicht von der zweiten Taste nach unten navigieren können. Da die obere Taste jetzt die untere als nextFocusUp definiert hat (und umgekehrt), wird der Navigationsfokus von oben nach unten und von unten nach oben.
Wenn Sie eine Ansicht in Ihrer Benutzeroberfläche als fokussierbar deklarieren möchten, was normalerweise nicht der Fall ist,
Fügen Sie in Ihrer Layout-Deklaration der Ansicht das XML-Attribut android:focusable
hinzu.
Legen Sie den Wert true fest. Sie können auch eine Datenansicht
im Touch-Modus mit android:focusableInTouchMode
als fokussierbar sein.
Wenn Sie eine bestimmte Ansicht anfordern möchten, um den Fokus zu erhalten, rufen Sie
auf.requestFocus()
Um auf Fokusereignisse zu warten (d. h. benachrichtigt zu werden, wenn eine Ansicht den Fokus aufnimmt oder verliert), verwenden Sie
,
enthalten, wie im Abschnitt Ereignis-Listener beschrieben.onFocusChange()