Android - Behandeln Sie "Enter" in einem EditText


459

Ich frage mich, ob es eine Möglichkeit gibt, mit dem Drücken des Benutzers Enterbeim Eingeben eines EditTextHTML-Ereignisses wie onSubmit umzugehen.

Sie fragen sich auch, ob es eine Möglichkeit gibt, die virtuelle Tastatur so zu manipulieren, dass die Schaltfläche "Fertig" mit etwas anderem gekennzeichnet ist (z. B. "Los") und beim Klicken eine bestimmte Aktion ausführt (wie bei onSubmit).


1
Kotlin & Extensions: Schauen Sie hier: stackoverflow.com/a/48810268/1912924
Francesco Donzello

Antworten:


374

Ich frage mich, ob es eine Möglichkeit gibt, mit dem Drücken des Benutzers Enterbeim Eingeben eines EditText umzugehen, beispielsweise mit dem HTML-Ereignis onSubmit.

Ja.

Sie fragen sich auch, ob es eine Möglichkeit gibt, die virtuelle Tastatur so zu manipulieren, dass die Schaltfläche "Fertig" mit etwas anderem gekennzeichnet ist (z. B. "Los") und beim Klicken eine bestimmte Aktion ausführt (wie bei onSubmit).

Auch ja.

Sie werden an die aussehen wollen android:imeActionIdund android:imeOptionsAttribute, sowie die setOnEditorActionListener()Verfahren, die alle aufTextView .

Verwenden Sie Folgendes, um den Text der Schaltfläche "Fertig" in eine benutzerdefinierte Zeichenfolge zu ändern:

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

26
(PS EditText erweitert TextView, daher befinden sich die Eigenschaften, die Sie sich ansehen sollten, in TextView - als ich den letzten Satz zum ersten Mal gelesen habe, habe ich eine doppelte Aufnahme gemacht :))
Ricket

15
Als Hinweis. Nicht alle Tastaturen unterstützen das Standardattribut android: imeOptions. Welches ist wirklich enttäuschend. Zum Beispiel ist IME_ACTION_DONE als 6 definiert, wobei die HTC-Standardtastatur (auf Telefonen wie Incredible, Evo 4G) die
Eingabetaste

13
Auch wenn Sie mit imeOptions sicherstellen, dass Sie auch inputType = "text" oder ein anderes Äquivalent verwenden. Damit die Tastatur auf Sie hört! Nexus1
Blundell

6
"Ja" - Würden Sie aussagekräftiger sein? Er wird wahrscheinlich fragen, wie die Lösung implementiert werden soll.
Al Wang

4
@AlWang: Zunächst wird Ihr Problembereich in der Antwort behandelt (siehe beginnend mit "Sie werden wollen ..."). Zweitens ist diese Antwort von vor sechs Jahren , und so würde man annehmen, dass das Problem des OP gelöst wurde. Immerhin akzeptierte das OP die Antwort.
CommonsWare

267
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;
    }
});

1
Wenn ich enterin meinen Bearbeitungstext klicke, wird aus irgendeinem Grund der gesamte Bearbeitungstext nach unten verschoben ... Wie kann ich das beheben?
Ruchir Baronia

1
@RuchirBaronia Füge android: maxLines = "1" zu deinem EditText hinzu. Ihr EditText bewegt sich nicht nach unten, sondern fügt einen Zeilenumbruch in den eingegebenen Text ein. Wenn Sie maxLines auf 1 setzen, wird verhindert, dass der Zeilenumbruch eingefügt wird.
lustig

3
Diese Lösung funktioniert nur für Hardwaretastaturen, NICHT für die Soft / Virtual-Tastatur. Wenn Sie sich darauf verlassen, wird Ihre App für Benutzer ohne angeschlossene Tastaturen beschädigt.
user3562927

12
Nichts gegen CommonsWare, aber seine RTFM Antwort war Art und Weise weniger nützlich , als dieses einfache Beispiel zeigt genau , wie es zu tun. Vielen Dank!
AutonomousApps

1
@AutonomousApps, ich sehe oft CommonsWare-Antworten. Er hatte das Glück, seit 2009 zu antworten, als Android begann. Oft "Ja", "Nein", "Unmöglich" und so weiter, normalerweise ohne Code. Oft sind seine Antworten jetzt veraltet, deshalb versuche ich, seinen Empfehlungen nicht zu folgen.
CoolMind

215

Hier ist was du tust. Es ist auch im Beispielcode des Android-Entwicklers 'Bluetooth Chat' versteckt. Ersetzen Sie die fett gedruckten Teile mit der Aufschrift "Beispiel" durch Ihre eigenen Variablen und Methoden.

Importieren Sie zunächst das, was Sie benötigen, in die Hauptaktivität, in der die Eingabetaste etwas Besonderes bewirken 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 zu tun ist, wenn die Eingabetaste gedrückt wird. Es muss wissen, um welchen EditText es sich handelt (hier verwende ich exampleView ), 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 Senden-Schaltfläche (oder OK, Bestätigen, Senden, Speichern 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 abschließend den Listener fest (höchstwahrscheinlich in Ihrer onCreate-Methode).

exampleView.setOnEditorActionListener(exampleListener);

20
Schön, ich habe EditorInfo.IME_ACTION_SEND verwendet und ich habe android: imeOptions = "actionSend" im XML.
Bani

Die Suche nach EditorInfo.IME_ACTION_SEND hatte für mich (Emulator) keine Auswirkung. Als narrensicherer Auslöser suchte ich auch nach KeyEvent.KEYCODE_ENTER. Siehe hier: stackoverflow.com/questions/2004344/…
Jemand irgendwo

4
Es ist normalerweise besser, Aktionen auszuführen KeyEvent.ACTION_UP. Damit dies funktioniert, müssen Sie zuerst das ACTION_DOWNEreignis konsumieren : if (actionId == EditorInfo.IME_NULL && event.getAction() == KeyEvent.ACTION_DOWN) { return true; }. Anschließend können Sie nach dem ACTION_UPEreignis suchen und die Aktion ausführen (ähnlich der obigen Antwort). Wenn Sie das ACTION_DOWNEreignis nicht nutzen, onEditorActionwird es nicht aufgerufen ACTION_UP.
Ashughes

2
Dies ist, was für mich funktioniert hat: if (event.getKeyCode() == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN) {...}- konnte keinen der anderen Ansätze zur Arbeit bekommen
Jonathan Ellis

38

Hardwaretastaturen liefern immer Eingabeereignisse, aber Softwaretastaturen geben in singleLine EditTexts unterschiedliche actionIDs und nulls zurück. Dieser Code reagiert jedes Mal, wenn der Benutzer die Eingabetaste in einem EditText drückt, auf den dieser Listener eingestellt 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 Standardeinstellung der Eingabetaste in singleLine = false ergibt eine gebogene Pfeiltaste. Wenn singleLine = true im letzten EditText, steht auf dem Schlüssel DONE und auf den EditTexts davor NEXT. Standardmäßig ist dieses Verhalten für alle Vanille-, Android- und Google-Emulatoren konsistent. Das scrollHorizontal-Attribut macht keinen Unterschied. Der Null-Test ist wichtig, da die Reaktion von Telefonen auf weiche Eingaben dem Hersteller überlassen bleibt und selbst in den Emulatoren die Vanilla Level 16-Emulatoren auf lange weiche Eingaben in mehrzeiligen und scrollHorizontalen EditTexts mit einer Aktions-ID von NEXT und einer Null für reagieren das Ereignis.


Als ich Java aktualisiert habe, ist meine Android-Toolkette kaputt gegangen. Es war 32-Bit. Ich habe alles 64-Bit neu installiert und festgestellt, dass es jetzt viel mehr öffentliche Emulatorversionen gibt. Ich muss zugeben, dass ich nur weiß, dass das Verhalten des EditorActionListener in den von mir getesteten Emulatoren konsistent ist.
Earlcasper

Als ich dies in meinem Blog gepostet habe, hat jemand kommentiert, dass Sie die Standard-IME-Aktion ändern müssen, damit es unter Eclipse funktioniert. Fügen Sie dann Android hinzu: imeOptions = ”actionGo”.
Earlcasper

Hoppla, ich habe den Kommentar in meinem Blog-Beitrag falsch verstanden. Damit es auf Eclipse funktioniert, müssen Sie die Standard-IME-Aktion ändern und Android hinzufügen: imeOptions = ”actionGo”. zum 'EditText' in der Layout-XML.
Earlcasper

Bei weiteren Überlegungen bezieht sich mein letzter Kommentar sowohl auf Ant als auch auf Eclipse
Earlcasper

27

Diese Seite beschreibt genau, wie das geht.

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

Stellen Sie die android: imeOptions ein, dann überprüfen Sie einfach die actionId in onEditorAction. Wenn Sie also imeOptions auf 'actionDone' setzen, suchen Sie in onEditorAction nach 'actionId == EditorInfo.IME_ACTION_DONE'. Stellen Sie außerdem sicher, dass Sie den android: inputType festlegen.

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 programmgesteuert mit der Funktion setImeOptions (int) festlegen . 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;
    }
});

21

Ich weiß, dass dies ein Jahr alt ist, aber ich habe gerade entdeckt, dass dies perfekt für einen EditText funktioniert.

EditText textin = (EditText) findViewById(R.id.editText1);
textin.setInputType(InputType.TYPE_CLASS_TEXT);

Es verhindert alles andere als Text und Leerzeichen. Ich konnte nicht tab, "return" ("\ n") oder irgendetwas.


Arbeitete für mich, mit der Hinzufügung der IME_ACTION_DONE
htafoya

1
Funktioniert einwandfrei, wenn Sie die Eingabetaste deaktivieren möchten.
DeeJ

16

Als Ergänzung zu Chad's Antwort (die für mich fast perfekt funktionierte) stellte ich fest, dass ich eine Überprüfung des KeyEvent-Aktionstyps hinzufügen musste, um zu verhindern, dass mein Code zweimal ausgeführt wird (einmal beim Key-Up und einmal beim Key-Down) Veranstaltung).

if (actionId == EditorInfo.IME_NULL && event.getAction() == KeyEvent.ACTION_DOWN)
{
    // your code here
}

Unter http://developer.android.com/reference/android/view/KeyEvent.html finden Sie Informationen zum Wiederholen von Aktionsereignissen (Halten der Eingabetaste) usw.


16

Ich hatte einen ähnlichen Zweck. Ich wollte das Drücken der Eingabetaste auf der Tastatur (die ich anpassen wollte) in einer AutoCompleteTextView lösen, die TextView erweitert. Ich habe verschiedene Lösungen von oben ausprobiert und sie schienen zu funktionieren. ABER ich hatte einige Probleme, als ich den Eingabetyp auf meinem Gerät (Nexus 4 mit AOKP ROM) von SwiftKey 3 (wo es perfekt funktionierte) auf die Standard-Android-Tastatur umstellte (wo anstatt meinen Code vom Listener zu verarbeiten, eine neue Zeile war Eingabe nach Drücken der Eingabetaste. Es hat eine Weile gedauert, bis ich dieses Problem behoben habe, aber ich weiß nicht, ob es unter allen Umständen funktioniert, unabhängig davon, welchen Eingabetyp Sie verwenden.

Also hier ist meine Lösung:

Setzen Sie das Eingabetypattribut der Textansicht in der XML auf "Text":

android:inputType="text"

Passen Sie die Beschriftung der Eingabetaste auf der Tastatur an:

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

Setzen Sie einen OnEditorActionListener auf die Textansicht:

myTextView.setOnEditorActionListener(new OnEditorActionListener()
{
    @Override
    public boolean onEditorAction(TextView v, int actionId,
        KeyEvent event)
    {
    boolean handled = false;
    if (event.getAction() == KeyEvent.KEYCODE_ENTER)
    {
        // Handle pressing "Enter" key here

        handled = true;
    }
    return handled;
    }
});

Ich hoffe, das kann anderen helfen, die Probleme zu vermeiden, die ich hatte, weil sie mich fast verrückt gemacht haben.


Leider funktioniert dies nicht mit der neuen Version 4 von SwiftKey. Und es macht mich wieder verrückt ...: - /
Kaolick

3
Ihr IF ist falsch. Verwenden Sie: 'event.getKeyCode () == KeyEvent.KEYCODE_ENTER'
Loda

Perfekt für mich. Denken Sie auch daran, das setImeActionLabel erneut in die IF-Anweisung einzufügen, da sonst der benutzerdefinierte Text nach dem ersten Drücken verschwindet.
Steve Rogers

Sein IF ist korrekt, da er seine actionId oben auf KeyEvent.KEYCODE_ENTER setzt :-D, aber ja, wahrscheinlich werden alle anderen event.getKeyCode () == KeyEvent.KEYCODE_ENTER
Ray Hulha

15

Fügen Sie in Ihrer XML das Attribut imeOptions zum editText hinzu

<EditText
    android:id="@+id/edittext_additem"
    ...
    android:imeOptions="actionDone"
    />

Fügen Sie dann in Ihrem Java-Code den OnEditorActionListener demselben EditText hinzu

mAddItemEditText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if(actionId == EditorInfo.IME_ACTION_DONE){
                //do stuff
                return true;
            }
            return false;
        }
    });

Hier ist die Erklärung: ImeOptions = actionDone weist dem EnterKey "actionDone" zu. Der EnterKey auf der Tastatur ändert sich von "Enter" zu "Done". Wenn Sie also die Eingabetaste drücken, wird diese Aktion ausgelöst, und Sie werden damit umgehen.


9

Sie können es auch tun ..

editText.setOnKeyListener(new OnKeyListener() {

            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event)
            {
                if (event.getAction() == KeyEvent.ACTION_DOWN
                        && event.getKeyCode() ==       KeyEvent.KEYCODE_ENTER) 
                {
                    Log.i("event", "captured");

                    return false;
                } 

            return false;
        }
    });

Wenn ich enterin meinen Bearbeitungstext klicke, wird aus irgendeinem Grund der gesamte Bearbeitungstext nach unten verschoben ... Wie kann ich das beheben?
Ruchir Baronia

Ich denke, Sie möchten stackoverflow.com/questions/10978038/… lernen . Andernfalls zeigen Sie mir Ihre XML
Jawad Zeb

6
     password.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if(event != null && event.getKeyCode() == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN) {
                InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);
                submit.performClick();
                return true;
            }
            return false;
        }
    });

Funktioniert sehr gut für mich.
Außerdem Tastatur ausblenden


5

Zuerst müssen Sie EditText einstellen, um den Tastendruck anzuhören

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main); 

    // Set the EditText listens to key press
    EditText edittextproductnumber = (EditText) findViewById(R.id.editTextproductnumber);
    edittextproductnumber.setOnKeyListener(this);

}

Zweitens definieren Sie das Ereignis beim Drücken der Taste, z. B. Ereignis, um den Text von TextView festzulegen:

@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
    // TODO Auto-generated method stub

 // Listen to "Enter" key press
 if ((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER))
 {
     TextView textviewmessage = (TextView) findViewById(R.id.textViewmessage);
     textviewmessage.setText("You hit 'Enter' key");
     return true;
 }

return false;   

}

Und vergessen Sie nicht, oben EditText, TextView, OnKeyListener, KeyEvent zu importieren:

import android.view.KeyEvent;
import android.view.View.OnKeyListener;
import android.widget.EditText;
import android.widget.TextView;

5

perfekt funktionieren

public class MainActivity extends AppCompatActivity {  
TextView t;
Button b;
EditText e;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    b = (Button) findViewById(R.id.b);
    e = (EditText) findViewById(R.id.e);

    e.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

            if (before == 0 && count == 1 && s.charAt(start) == '\n') {

                b.performClick();
                e.getText().replace(start, start + 1, ""); //remove the <enter>
            }

        }
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
        @Override
        public void afterTextChanged(Editable s) {}
    });

    b.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            b.setText("ok");

        }
    });
}

}}

perfekt funktionieren


5
editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if (actionId != 0 || event.getAction() == KeyEvent.ACTION_DOWN) {
                // Action
                return true;
            } else {
                return false;
            }
        }
    });

Xml

<EditText
        android:id="@+id/editText2"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:hint="@string/password"
        android:imeOptions="actionGo|flagNoFullscreen"
        android:inputType="textPassword"
        android:maxLines="1" />

4

Das sollte funktionieren

input.addTextChangedListener(new TextWatcher() {

           @Override
           public void afterTextChanged(Editable s) {}

           @Override    
           public void beforeTextChanged(CharSequence s, int start,
             int count, int after) {
           }

           @Override    
           public void onTextChanged(CharSequence s, int start,
             int before, int count) {
               if( -1 != input.getText().toString().indexOf( "\n" ) ){
                   input.setText("Enter was pressed!");
                    }
           }
          });

4

Geben Sie diesen Code in Ihren Editor ein, damit er die erforderlichen Module importieren kann.

 query.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView textView, int actionId, KeyEvent keyEvent) {
            if(actionId == EditorInfo.IME_ACTION_DONE
                    || keyEvent.getAction() == KeyEvent.ACTION_DOWN
                        || keyEvent.getAction() == KeyEvent.KEYCODE_ENTER) {

                // Put your function here ---!

                return true;

            }
            return false;
        }
    });

query = Name des EditText-Feldes und fügen Sie dieses -> (android: imeOptions = "actionSearch") in die XML-Datei von EditText ein.
Sanjit Prasad

3

Dies funktioniert gut auf LG Android-Handys. Es verhindert, dass ENTERandere Sonderzeichen als normale Zeichen interpretiert werden. NextDie DoneSchaltfläche oder wird automatisch angezeigt und ENTERfunktioniert wie erwartet.

edit.setInputType(InputType.TYPE_CLASS_TEXT);

Dies ist das EINZIGE, was für mich funktioniert hat. Ich habe ein Motorola Moto X 2 und normalerweise hat es eine "Return" -Taste mit dem Pfeil und allem. Dies änderte es in ein Häkchen und ich konnte den Hörer endlich dazu bringen, damit zu arbeiten. (Bevor es gerade eine neue Zeile erstellt hat). Also, wenn jemand anderes dieses Problem hat ...
Mystic Cola

2

Hier ist eine einfache statische Funktion, die Sie in Ihre Utilsoder Ihre KeyboardsKlasse einfügen können und die Code ausführt, wenn der Benutzer die Eingabetaste auf einer Hardware- oder Softwaretastatur drückt. Es ist eine modifizierte Version von @ earlcasper's ausgezeichneter Antwort

 /**
 * Return a TextView.OnEditorActionListener that will execute code when an enter is pressed on
 * the keyboard.<br>
 * <code>
 *     myTextView.setOnEditorActionListener(Keyboards.onEnterEditorActionListener(new Runnable()->{
 *         Toast.makeText(context,"Enter Pressed",Toast.LENGTH_SHORT).show();
 *     }));
 * </code>
 * @param doOnEnter A Runnable for what to do when the user hits enter
 * @return the TextView.OnEditorActionListener
 */
public static TextView.OnEditorActionListener onEnterEditorActionListener(final Runnable doOnEnter){
    return (__, actionId, event) -> {
        if (event==null) {
            if (actionId == EditorInfo.IME_ACTION_DONE) {
                // Capture soft enters in a singleLine EditText that is the last EditText.
                doOnEnter.run();
                return true;
            } else if (actionId==EditorInfo.IME_ACTION_NEXT) {
                // Capture soft enters in other singleLine EditTexts
                doOnEnter.run();
                return true;
            } 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.
                return true;
            } else {
                doOnEnter.run();
                return true;   // We consume the event when the key is released.
            }
        } else {
            // We let the system handle it when the listener
            // is triggered by something that wasn't an enter.
            return false;
        }
    };
}

Beachten Sie, dass hierfür ein Lambda-Ausdruck verwendet wird, für den Java 1.8 erforderlich ist. Es ist jedoch einfach genug, ihn so zu konvertieren, dass kein Lambda verwendet wird. Das Problem, das ich bei dieser Art von Lösungen gesehen habe, ist jedoch, dass die virtuelle Tastatur nicht automatisch ausgeblendet wird. Wenn sich der Vollbildmodus im Vollbildmodus (kleines Gerät im Querformat) befindet, wird er nicht ausgeschaltet, nachdem der Benutzer die Eingabetaste oder FERTIG gedrückt hat
jk7

2

InputType im Textfeld muss so sein text, dass das, was CommonsWare gesagt hat, funktioniert. Ich habe gerade alles versucht, kein inputType vor dem Test und nichts hat funktioniert. Enter hat sich weiterhin als Soft Enter registriert. Danach inputType = textfunktionierte alles einschließlich des setImeLabel.

Beispiel: android:inputType="text"


2
   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;
        }
    });

1

Eine zuverlässige Möglichkeit, auf eine <Eingabe> in einem EditText zu antworten, besteht in einem TextWatcher , einem LocalBroadcastManager und einem BroadcastReceiver . Sie müssen die v4-Unterstützungsbibliothek hinzufügen , um den LocalBroadcastManager verwenden zu können. Ich verwende das Tutorial auf vogella.com : 7.3 "Lokale Broadcast-Ereignisse mit LocalBroadcastManager" aufgrund des vollständigen, prägnanten Codebeispiels. In onTextChanged before ist der Index des Endes der Änderung vor der Änderung >; minus Start. Wenn der UI-Thread im TextWatcher gerade damit beschäftigt ist, den bearbeitbaren Text von editText zu aktualisieren, senden wir eine Absicht, den BroadcastReceiver zu aktivieren, wenn der UI-Thread die Aktualisierung von editText abgeschlossen hat.

import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.text.Editable;
//in onCreate:
editText.addTextChangedListener(new TextWatcher() {
  public void onTextChanged
  (CharSequence s, int start, int before, int count) {
    //check if exactly one char was added and it was an <enter>
    if (before==0 && count==1 && s.charAt(start)=='\n') {
    Intent intent=new Intent("enter")
    Integer startInteger=new Integer(start);
    intent.putExtra("Start", startInteger.toString()); // Add data
    mySendBroadcast(intent);
//in the BroadcastReceiver's onReceive:
int start=Integer.parseInt(intent.getStringExtra("Start"));
editText.getText().replace(start, start+1,""); //remove the <enter>
//respond to the <enter> here

Wenn Sie einen der Texteingabetypen (z. B. android:inputType="textCapSentences") verwenden, werden Wagenrückläufe aus der Eingabe herausgefiltert, sodass onTextChanged () nicht aufgerufen wird, wenn der Benutzer die Eingabetaste drückt.
jk7

1

Diese Frage wurde mit Butterknife noch nicht beantwortet

LAYOUT XML

<android.support.design.widget.TextInputLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/some_input_hint">

        <android.support.design.widget.TextInputEditText
            android:id="@+id/textinput"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:imeOptions="actionSend"
            android:inputType="text|textCapSentences|textAutoComplete|textAutoCorrect"/>
    </android.support.design.widget.TextInputLayout>

JAVA APP

@OnEditorAction(R.id.textinput)
boolean onEditorAction(int actionId, KeyEvent key){
    boolean handled = false;
    if (actionId == EditorInfo.IME_ACTION_SEND || (key.getKeyCode() == KeyEvent.KEYCODE_ENTER)) {
        //do whatever you want
        handled = true;
    }
    return handled;
}

TextInputLayout und Butterknife: GEWINNEN!
Javi

1

Mit Kotlin habe ich eine Funktion erstellt, die alle Arten von "erledigten" Aktionen für EditText verarbeitet, einschließlich der Tastatur. Sie können sie ändern und auch andere Tasten nach Ihren Wünschen verarbeiten:

private val DEFAULT_ACTIONS_TO_HANDLE_AS_DONE_FOR_EDIT_TEXT = arrayListOf(EditorInfo.IME_ACTION_SEND, EditorInfo.IME_ACTION_GO, EditorInfo.IME_ACTION_SEARCH, EditorInfo.IME_ACTION_DONE)
private val DEFAULT_KEYS_TO_HANDLE_AS_DONE_FOR_EDIT_TEXT = arrayListOf(KeyEvent.KEYCODE_ENTER, KeyEvent.KEYCODE_NUMPAD_ENTER)

fun EditText.setOnDoneListener(function: () -> Unit, onKeyListener: OnKeyListener? = null, onEditorActionListener: TextView.OnEditorActionListener? = null,
                               actionsToHandle: Collection<Int> = DEFAULT_ACTIONS_TO_HANDLE_AS_DONE_FOR_EDIT_TEXT,
                               keysToHandle: Collection<Int> = DEFAULT_KEYS_TO_HANDLE_AS_DONE_FOR_EDIT_TEXT) {
    setOnEditorActionListener { v, actionId, event ->
        if (onEditorActionListener?.onEditorAction(v, actionId, event) == true)
            return@setOnEditorActionListener true
        if (actionsToHandle.contains(actionId)) {
            function.invoke()
            return@setOnEditorActionListener true
        }
        return@setOnEditorActionListener false
    }
    setOnKeyListener { v, keyCode, event ->
        if (onKeyListener?.onKey(v, keyCode, event) == true)
            return@setOnKeyListener true
        if (event.action == KeyEvent.ACTION_DOWN && keysToHandle.contains(keyCode)) {
            function.invoke()
            return@setOnKeyListener true
        }
        return@setOnKeyListener false
    }
}

Beispielverwendung:

        editText.setOnDoneListener({
            //do something
        })

Ich denke, dass das Ändern des Etiketts von der Tastatur-App abhängt und dass es sich normalerweise nur im Querformat ändert, wie hier geschrieben . Wie auch immer, Beispielverwendung dafür:

        editText.imeOptions = EditorInfo.IME_ACTION_DONE
        editText.setImeActionLabel("ASD", editText.imeOptions)

Oder wenn Sie in XML wollen:

    <EditText
        android:id="@+id/editText" android:layout_width="wrap_content" android:layout_height="wrap_content"
        android:imeActionLabel="ZZZ" android:imeOptions="actionDone" />

Und das Ergebnis (im Querformat dargestellt):

Geben Sie hier die Bildbeschreibung ein


0

Fügen Sie diese abhängig hinzu, und es sollte funktionieren:

import android.view.KeyEvent;
import android.view.View;
import android.widget.EditText;

0

Dies gibt Ihnen eine aufrufbare Funktion, wenn der Benutzer die Eingabetaste drückt.

fun EditText.setLineBreakListener(onLineBreak: () -> Unit) {
    val lineBreak = "\n"
    doOnTextChanged { text, _, _, _ ->
        val currentText = text.toString()

        // Check if text contains a line break
        if (currentText.contains(lineBreak)) {

            // Uncommenting the lines below will remove the line break from the string
            // and set the cursor back to the end of the line

            // val cleanedString = currentText.replace(lineBreak, "")
            // setText(cleanedString)
            // setSelection(cleanedString.length)

            onLineBreak()
        }
    }
}

Verwendungszweck

editText.setLineBreakListener {
    doSomething()
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.