Wissen, wann die Bearbeitung von Text abgeschlossen ist

74

Woher weiß ich, wann die Bearbeitung meines Textes abgeschlossen ist? Zum Beispiel, wenn der Benutzer das nächste Feld auswählt oder die Fertig-Taste auf der Softtastatur drückt.

Ich möchte das wissen, damit ich den Eingang klemmen kann. Es sieht so aus, als ob das afterTextChanged des Textbeobachters nach der Eingabe jedes Zeichens erfolgt. Ich muss einige Berechnungen mit der Eingabe durchführen, daher möchte ich die Berechnung nach der Eingabe jedes Zeichens vermeiden.

Vielen Dank

Matt
quelle

Antworten:

107

Mit so etwas

 meditText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            switch (actionId){
                case EditorInfo.IME_ACTION_DONE:
                case EditorInfo.IME_ACTION_NEXT:
                case EditorInfo.IME_ACTION_PREVIOUS:
                    yourcalc();
                    return true;
            }
            return false;
        }
    });
Reno
quelle
OK, Ihre und Richs Antworten scheinen das zu sein, was ich brauche, danke. Gibt es eine Möglichkeit, den editText zu deaktivieren, wenn der Benutzer mit dieser Methode fertig ist? Ich habe v.clearfocus ausprobiert, aber das scheint nichts zu bewirken ... Wenn ich die Fokussierung aufheben könnte, würde die Aktion einfach an den Listener für Fokuswechsel weitergeleitet.
Matt
1
@Matt: Ich denke das Problem ist, dass die Schaltfläche nicht den Fokus erfasst? Ich habe eine Routine implementiert, bei der die Schaltfläche den Fokus beim Klicken genau erfasst (ich glaube, die Methode heißt requestFocus). Denn wenn der Knopf fokussiert, würde Ihr Textfeld ihn verlieren und alles wäre gut.
AgentKnopf
Wenn der Benutzer nach dem Bearbeiten von Text in edittext im Softinput anstelle der Schaltfläche "Fertig" die Taste "Zurück" drückt. was passiert dann in diesem Fall wird die Methode yourcalc () aufgerufen oder nicht?
Brijesh Patel
Wird dies auch das Ereignis erfassen, wenn der Fokus manuell auf eine andere Ansicht umgeschaltet wird?
Mr5
1
Sie können auch Aktionen wie: EditorInfo.IME_ACTION_NEXTund ausführen IME_ACTION_PREVIOUS. Ich habe gerade die Antwort bearbeitet, indem ich sie dem Code
hinzugefügt habe
42

EditTexterbt, setOnFocusChangeListenerwas eine Implementierung von erfordert OnFocusChangeListener.

Implementieren onFocusChangeund es gibt einen booleschen Parameter für hasFocus. Wenn dies falsch ist, haben Sie den Fokus auf ein anderes Steuerelement verloren.

BEARBEITEN

Um beide Fälle zu behandeln - bearbeiten Sie Text, der den Fokus verliert, ODER der Benutzer klickt auf die Schaltfläche "Fertig" - erstellen Sie eine einzelne Methode, die von beiden Listenern aufgerufen wird.

    private void calculate() { ... }

    btnDone.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            calculate();
        }
    });

    txtEdit.setOnFocusChangeListener(new OnFocusChangeListener() {          

        public void onFocusChange(View v, boolean hasFocus) {
            if(!hasFocus)
                calculate();
        }
    });
Reich
quelle
OK, das funktioniert aber nur, wenn der Benutzer auf etwas anderes klickt. Gibt es eine Möglichkeit zu erkennen, wann der Benutzer auch auf Fertig drückt? BEARBEITEN: Oder heben Sie den Fokus auf, wenn der Benutzer auf Fertig drückt.
Matt
1
Ja. Lassen Sie einfach den OnFocusChangeListener von EditText und den OnClickListener von Button dieselbe Berechnungsmethode aufrufen. Ich habe meine Antwort so bearbeitet, dass sie diesen Code enthält. ^
Rich
Durch Hinzufügen von 'android: imeOptions = "actionNext"' zu txtEdits XML wurde der Fokus verloren, als die Softtastatur NextKey auf meinem Samsung Galaxy gedrückt wurde. Durch Hinzufügen von 'txtEdit.setOnKeyListener (neuer OnKeyListener () {' zu onCreate () reagierte ein Emulator ohne Softtastatur auf den EnterKey.
earlcasper
15

Verwenden einer EditText-Objekt-XML, die wie folgt definiert ist:

    <EditText
        android:id="@+id/create_survey_newquestion_editText_minvalue"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:ems="4"
        android:imeOptions="actionDone"
        android:inputType="number" />

Wir können seinen Text erfassen i) wenn der Benutzer auf der Softtastatur (OnEditorActionListener) auf die Schaltfläche Fertig klickt oder ii) wenn der EditText den Benutzerfokus (OnFocusChangeListener) verloren hat, der sich jetzt auf einem anderen EditText befindet:

    /**
     * 3. Set the min value EditText listener
     */
    editText= (EditText) this.viewGroup.findViewById(R.id.create_survey_newquestion_editText_minvalue);
    editText.setOnEditorActionListener(new OnEditorActionListener()
    {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event)
        {
            String input;
            if(actionId == EditorInfo.IME_ACTION_DONE)
            {
                input= v.getText().toString();
                MyActivity.calculate(input);
                return true; // consume.
            }
            return false; // pass on to other listeners.
        }
    });
    editText.setOnFocusChangeListener(new View.OnFocusChangeListener()
    {
        @Override
        public void onFocusChange(View v, boolean hasFocus)
        {
            String input;
            EditText editText;

            if(!hasFocus)
            {
                editText= (EditText) v;
                input= editText.getText().toString();
                MyActivity.calculate(input);
            }
        }
    });

Das funktioniert bei mir. Sie können die Softtastatur nach den Berechnungen mit einem Code wie dem folgenden ausblenden:

private void hideKeyboard(EditText editText)
{
    InputMethodManager imm= (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
}

Bearbeiten: Rückgabewerte zu onEditorAction hinzugefügt

jsanmarb
quelle
3

Ich habe diese einfache Sache gemacht, wenn der Fokus von Text bearbeiten verschoben wird, um den Text zu erhalten. Dies funktioniert, wenn der Benutzer den Fokus verschiebt, um andere Ansichten wie eine Schaltfläche oder einen anderen EditText oder eine andere Ansicht auszuwählen.

        editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (!hasFocus) {
                EditText editText = (EditText) v;
                String text = editText.getText().toString();
             }
        }
    });
Murli
quelle