535 Stimmen

Android - Handhabung von "Enter" in einem EditText

Ich frage mich, ob es eine Möglichkeit gibt, den Benutzer zu behandeln, der Enter während der Eingabe eines EditText so etwas wie das HTML-Ereignis onSubmit.

Ich frage mich auch, ob es eine Möglichkeit gibt, die virtuelle Tastatur so zu manipulieren, dass die Schaltfläche "Fertig" mit etwas anderem beschriftet ist (z. B. "Los") und eine bestimmte Aktion ausführt, wenn sie angeklickt wird (wiederum wie bei onSubmit).

414voto

CommonsWare Punkte 950864

Ich frage mich, ob es eine Möglichkeit gibt zu behandeln, wenn der Benutzer Enter während in einen EditText eintippen, so etwas wie das HTML-Ereignis onSubmit.

Ja.

Ich frage mich auch, ob es eine Möglichkeit gibt die virtuelle Tastatur so zu manipulieren so zu manipulieren, dass die "Fertig"-Taste mit etwas anderem beschriftet ist (zum Beispiel "Go") und eine bestimmte Aktion ausführt wenn sie angeklickt wird (wiederum wie bei onSubmit).

Auch ja.

Sie sollten sich die android:imeActionId y android:imeOptions Attribute, sowie die setOnEditorActionListener() Methode, alle auf TextView .

Um den Text der Schaltfläche "Fertig" in eine eigene Zeichenfolge zu ändern, verwenden Sie:

mEditText.setImeActionLabel("Custom text", KeyEvent.KEYCODE_ENTER);

321voto

Jarod DY Law Punkte 5577
final EditText edittext = (EditText) findViewById(R.id.edittext);
edittext.setOnKeyListener(new OnKeyListener() {
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        // If the event is a key-down event on the "enter" button
        if ((event.getAction() == KeyEvent.ACTION_DOWN) &&
            (keyCode == KeyEvent.KEYCODE_ENTER)) {
          // Perform action on key press
          Toast.makeText(HelloFormStuff.this, edittext.getText(), Toast.LENGTH_SHORT).show();
          return true;
        }
        return false;
    }
});

221voto

Chad Hedgcock Punkte 10251

So gehen Sie vor. Es ist auch im Beispielcode "Bluetooth Chat" von Android Developer versteckt. Ersetzen Sie die fettgedruckten Teile, die sagen "Beispiel" mit Ihren eigenen Variablen und Methoden.

Importieren Sie zunächst das, was Sie brauchen, in die Hauptaktivität, in der die Schaltfläche "Zurück" eine besondere Funktion erfüllen soll:

import android.view.inputmethod.EditorInfo;
import android.widget.TextView;
import android.view.KeyEvent;

Erstellen Sie nun eine Variable vom Typ TextView.OnEditorActionListener für Ihren Rückgabeschlüssel (hier verwende ich exampleListener );

TextView.OnEditorActionListener exampleListener = new TextView.OnEditorActionListener(){

Dann müssen Sie dem Hörer zwei Dinge mitteilen, was er tun soll, wenn die Return-Taste gedrückt wird. Er muss wissen, um welchen EditText es sich handelt (hier verwende ich Beispielansicht ), und dann muss es wissen, was zu tun ist, wenn die Eingabetaste gedrückt wird (hier, example_confirm() ). Wenn dies der letzte oder einzige EditText in Ihrer Aktivität ist, sollte er dasselbe tun wie die onClick-Methode für Ihre Schaltfläche Submit (oder OK, Confirm, Send, Save usw.).

public boolean onEditorAction(TextView exampleView, int actionId, KeyEvent event) {
   if (actionId == EditorInfo.IME_NULL  
      && event.getAction() == KeyEvent.ACTION_DOWN) { 
      example_confirm();//match this behavior to your 'Send' (or Confirm) button
   }
   return true;
}

Legen Sie schließlich den Hörer fest (höchstwahrscheinlich in Ihrer onCreate-Methode);

exampleView.setOnEditorActionListener(exampleListener);

64voto

Mike Punkte 5302

Auf dieser Seite wird genau beschrieben, wie Sie dies tun können.

https://developer.Android.com/training/keyboard-input/style.html

Stellen Sie die Android:imeOptions dann prüfen Sie einfach die actionId in onEditorAction. Wenn Sie also imeOptions auf "actionDone" setzen, würden Sie in onEditorAction auf "actionId == EditorInfo.IME_ACTION_DONE" prüfen. Stellen Sie außerdem sicher, dass Sie den Android:inputType setzen.

Wenn Sie Material Design verwenden, setzen Sie den Code in TextInputEditText.

Hier ist der EditText aus dem oben verlinkten Beispiel:

<EditText
    android:id="@+id/search"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:hint="@string/search_hint"
    android:inputType="text"
    android:imeOptions="actionSend" />

Sie können dies auch programmatisch festlegen, indem Sie die setImeOptions(int) Funktion. Hier ist der OnEditorActionListener aus dem oben verlinkten Beispiel:

EditText editText = (EditText) findViewById(R.id.search);
editText.setOnEditorActionListener(new OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        boolean handled = false;
        if (actionId == EditorInfo.IME_ACTION_SEND) {
            sendMessage();
            handled = true;
        }
        return handled;
    }
});

44voto

earlcasper Punkte 915

Hardware-Tastaturen liefern immer Enter-Ereignisse, aber Software-Tastaturen liefern unterschiedliche actionIDs und Nullen in einzeiligen EditTexten. Dieser Code reagiert jedes Mal, wenn der Benutzer die Eingabetaste in einem EditText drückt, auf den dieser Listener gesetzt wurde, unabhängig von EditText oder Tastaturtyp.

import android.view.inputmethod.EditorInfo;
import android.view.KeyEvent;
import android.widget.TextView.OnEditorActionListener;

listener=new TextView.OnEditorActionListener() {
  @Override
  public boolean onEditorAction(TextView view, int actionId, KeyEvent event) {
    if (event==null) {
      if (actionId==EditorInfo.IME_ACTION_DONE);
      // Capture soft enters in a singleLine EditText that is the last EditText.
      else if (actionId==EditorInfo.IME_ACTION_NEXT);
      // Capture soft enters in other singleLine EditTexts
      else return false;  // Let system handle all other null KeyEvents
    }
    else if (actionId==EditorInfo.IME_NULL) { 
    // Capture most soft enters in multi-line EditTexts and all hard enters.
    // They supply a zero actionId and a valid KeyEvent rather than
    // a non-zero actionId and a null event like the previous cases.
      if (event.getAction()==KeyEvent.ACTION_DOWN); 
      // We capture the event when key is first pressed.
      else  return true;   // We consume the event when the key is released.  
    }
    else  return false; 
    // We let the system handle it when the listener
    // is triggered by something that wasn't an enter.

    // Code from this point on will execute whenever the user
    // presses enter in an attached view, regardless of position, 
    // keyboard, or singleLine status.

    if (view==multiLineEditText)  multiLineEditText.setText("You pressed enter");
    if (view==singleLineEditText)  singleLineEditText.setText("You pressed next");
    if (view==lastSingleLineEditText)  lastSingleLineEditText.setText("You pressed done");
    return true;   // Consume the event
  }
};

Die Standarddarstellung der Eingabetaste bei singleLine=false ergibt eine gebogene Pfeileingabetastatur. Wenn singleLine=true im letzten EditText steht auf der Taste DONE, und in den EditTexten davor steht NEXT. Standardmäßig ist dieses Verhalten in allen Vanilla-, Android- und Google-Emulatoren gleich. Das scrollHorizontal-Attribut macht keinen Unterschied. Der Null-Test ist wichtig, weil die Reaktion von Telefonen auf Soft-Eingaben dem Hersteller überlassen wird und selbst in den Emulatoren reagieren die Vanilla-Level-16-Emulatoren auf lange Soft-Eingaben in mehrzeiligen und scrollHorizontal-EditTexten mit einer actionId von NEXT und einer Null für das Ereignis.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X