Implizites "Senden", nachdem Sie beim letzten EditText auf der Tastatur auf "Fertig" geklickt haben

96

Ich habe einige Apps verwendet, bei denen das Anmeldeformular automatisch gesendet wird, wenn ich meinen Benutzernamen eingebe und dann zu meinem Passwort gehe. Wenn ich auf der Tastatur auf "Fertig" klicke, muss ich nicht auf die Schaltfläche "Senden" klicken. Wie wird das gemacht?

JK
quelle
Versuchen Sie diese
Linkantwort
Schneller Link zu den Dokumenten: Geben Sie die Eingabemethode Aktion an
FirstOne

Antworten:

185

Versuche dies:

Fügen Sie in Ihrem Layout Folgendes ein / bearbeiten Sie Folgendes:

<EditText
    android:id="@+id/search_edit"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:inputType="text"
    android:singleLine="true"
    android:imeOptions="actionDone" />

Geben Sie in Ihrer Aktivität Folgendes ein (z. B. in onCreate):

 // your text box
 EditText edit_txt = (EditText) findViewById(R.id.search_edit);

 edit_txt.setOnEditorActionListener(new EditText.OnEditorActionListener() {
     @Override
     public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
         if (actionId == EditorInfo.IME_ACTION_DONE) {
             submit_btn.performClick();
             return true;
         }
         return false;
     }
 });

Wo submit_btnbefindet sich Ihre Senden-Schaltfläche mit Ihrem angehängten Onclick-Handler?

Hariharan
quelle
15
submit_btn.performClick();brennt meine Augen. Srsly? Warum nicht die Submit-Methode aufrufen?
Laurent Meyer
28
@LaurentMeyer In diesen Situationen ist es normalerweise besser, Benutzereingaben zu simulieren, als die zugrunde liegende Logik direkt aufzurufen. Beispielsweise ist die Senden-Schaltfläche derzeit möglicherweise deaktiviert, sodass performClick () (wie beabsichtigt) nichts unternimmt. Wenn Sie jedoch die Senden-Methode direkt aufrufen, müssen Sie zunächst überprüfen, ob die Schaltfläche nicht deaktiviert wurde. Es wird auch der "Klick" -Sound
abgespielt,
3
@LaurentMeyer Was meinst du mit UI-sensitiv? Und 5 Leute in den letzten 6 Monaten, klar. Geben Sie ihnen Zeit und die Leute werden mir wahrscheinlich auch zustimmen. ;)
Extragorey
Nehmen wir an, Sie ändern die Benutzeroberfläche, die die Schaltfläche für etwas anderes verwendet. Der Code wird ein echtes Durcheinander sein und noch schlimmer, Sie müssen wirklich umfangreiche Testverfahren haben, um diese Art von Fehler zu erkennen. Noch schlimmer ist es, wenn Sie die UI-Komponente mit solchen Praktiken teilen.
Laurent Meyer
1
TWIMC hat imeActionLabelin meinem EditText all dieses Verhalten deaktiviert. Achtung
Alwin Kesler
25

Sie müssen die IME-Optionen auf Ihrem einstellen EditText.

<EditText
    android:id="@+id/some_view"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:hint="Whatever"
    android:inputType="text"
    android:imeOptions="actionDone" />

Fügen Sie OnEditorActionListenerdann der Ansicht ein hinzu, um auf die Aktion "Fertig" zu warten.

EditText editText = (EditText) findViewById(R.id.some_view);
editText.setOnEditorActionListener(new OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        boolean handled = false;
        if (actionId == EditorInfo.IME_ACTION_DONE) {
            // TODO do something
            handled = true;
        }
        return handled;
    }
});

Offizielles API-Dokument: https://developer.android.com/guide/topics/ui/controls/text.html#ActionEvent

flx
quelle
22

Einfache und effektive Lösung mit Kotlin

Erweitern EditText:

fun EditText.onSubmit(func: () -> Unit) {
    setOnEditorActionListener { _, actionId, _ ->

       if (actionId == EditorInfo.IME_ACTION_DONE) {
           func()
       }

       true

    }
}

Verwenden Sie dann die neue Methode wie folgt:

editText.onSubmit { submit() }

Wo submit()ist so etwas:

fun submit() {
    // call to api
}

Generischere Erweiterung

fun EditText.on(actionId: Int, func: () -> Unit) {
    setOnEditorActionListener { _, receivedActionId, _ ->

       if (actionId == receivedActionId) {
           func()
       }

        true
    }
}

Und dann können Sie damit Ihre Veranstaltung anhören:

email.on(EditorInfo.IME_ACTION_NEXT, { confirm() })
Francesco Donzello
quelle
6

So wird es gemacht

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

Vergiss nicht hinzuzufügen

<EditText android:layout_height="wrap_content"

android:layout_width="wrap_content"

android:imeOptions="actionDone"/>

actionDone in Ihrem EditText.

Jitender Dev
quelle
2

Fügen Sie in Ihrer XML-Datei in Ihrem edittext-Tag das folgende Snippet hinzu

android:imeOptions="actionDone"

Schreiben Sie dann in Ihre Java-Klasse den folgenden Code

editText.setOnEditorActionListener(new EditText.OnEditorActionListener() { 


@Override 
  public boolean onEditorAction(TextView v, int id, KeyEvent event) { 
   if (id == EditorInfo.IME_ACTION_DONE) { 
      //do your work here 
      return true;
    } 

        return false; 
   } 
  });
Madhu Kumar
quelle
1

Fügen Sie die folgende Zeile in edittext ein

android:imeOptions="actionDone"

Viel Spaß beim Codieren

Senthil JS
quelle
1
etParola = (EditText) findViewById(R.id.etParola); 
 btnGiris = (Button) findViewById(R.id.btnGiris);
  etParola.setOnEditorActionListener(new EditText.OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                if (actionId == EditorInfo.IME_ACTION_DONE) {
                    btnGiris.performClick();
                    return true;
                }
                return false;
            }
        });

 and;


layout xml etParola
android:imeOptions="actionDone" add
Rabia Aydoğdu
quelle
Dies ist genau die gleiche Antwort wie diese . Sie sollten ein wenig erklären, wie Sie denken, dass dies das Problem von OP löst.
Adrian W
1

Erweitern Sie einfach diese Antwort

fun EditText.onSubmit(func: () -> Unit) {
    setOnEditorActionListener { _, actionId, _ ->
        if (actionId == EditorInfo.IME_ACTION_DONE) {
            clearFocus() // if needed 
            hideKeyboard()
            func()
        }
        true
    }
}

fun EditText.hideKeyboard() {
    val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    imm.hideSoftInputFromWindow(this.windowToken, 0)
}
Bitvale
quelle
0
<EditText
        android:id="@+id/signinscr_userName"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:hint="@string/userName"
        android:imeOptions="actionNext" />

    <EditText
        android:id="@+id/signinscr_password"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:hint="@string/password"
        android:imeOptions="actionDone"
        android:inputType="textPassword" />

in der .java-Datei

EditText userNameField = (EditText) findViewById(R.id.signinscr_userName);
    EditText passwordField = (EditText) findViewById(R.id.signinscr_password);
    passwordField.setOnEditorActionListener(new OnEditorActionListener() {
        public boolean onEditorAction(TextView arg0, int arg1, KeyEvent arg2) {
            //Do your operation here.
            return false;
        }
    });
Amit Gupta
quelle
0
 EditText edit_txt = (EditText) findViewById(R.id.search_edit);

 edit_txt.setOnEditorActionListener(new EditText.OnEditorActionListener() {
     @Override
     public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
// which is u had set a imeoption
         if (actionId == EditorInfo.IME_ACTION_DONE) {
             submit_btn.performClick();
             return true;
         }
         return false;
     }
 });
Divyesh Kevadiya
quelle