Eingabeereignisse – Übersicht

Schreiben Sie jetzt
Jetpack Compose ist das empfohlene UI-Toolkit für Android. Weitere Informationen zur Verwendung von Berührungen und Eingaben in „Schreiben“
<ph type="x-smartling-placeholder"></ph> Umgang mit Nutzerinteraktionen →

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 setOnClickListener() und übergeben Sie Ihre Implementierung von 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:

  • 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. die als Zuhörer aktiviert sind.
  • onKey() – 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.
  • onTouch() – 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.

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 dispatchKeyEvent()-Methode ansehen. Anstatt Schlüsselereignisse über die Ansicht zu erfassen, können Sie auch alle Ereignisse in deinen Aktivitäten mit onKeyDown() und 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 onKeyDown(). 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 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:

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:

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 isFocusable(). Um festzulegen, ob eine Ansicht setFocusable() anrufen. Im Touchmodus Sie können mit isFocusableInTouchMode() abfragen, ob eine Ansicht den Fokus zulässt. Sie können dies mit setFocusableInTouchMode() ändern.

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 requestFocus() auf.

Um auf Fokusereignisse zu warten (d. h. benachrichtigt zu werden, wenn eine Ansicht den Fokus aufnimmt oder verliert), verwenden Sie onFocusChange(), enthalten, wie im Abschnitt Ereignis-Listener beschrieben.