web-dev-qa-db-de.com

Wie gehe ich mit der Schaltfläche "Fertig" von ImeOptions um?

Ich habe eine EditText wo ich die folgende Eigenschaft einstelle, so dass ich die done-Schaltfläche auf der Tastatur anzeigen kann, wenn der Benutzer auf EditText klickt.

editText.setImeOptions(EditorInfo.IME_ACTION_DONE);

Wenn der Benutzer auf die Schaltfläche Fertig auf der Bildschirmtastatur klickt (Eingabe abgeschlossen), möchte ich den RadioButton -Zustand ändern.

Wie kann ich die Schaltfläche "Fertig" verfolgen, wenn sie von der Bildschirmtastatur getroffen wird?

enter image description here

158
d-man

Ich endete mit einer Kombination von Roberts- und Chirags-Antworten:

((EditText)findViewById(R.id.search_field)).setOnEditorActionListener(
        new EditText.OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        // Identifier of the action. This will be either the identifier you supplied,
        // or EditorInfo.IME_NULL if being called due to the enter key being pressed.
        if (actionId == EditorInfo.IME_ACTION_SEARCH
                || actionId == EditorInfo.IME_ACTION_DONE
                || event.getAction() == KeyEvent.ACTION_DOWN
                && event.getKeyCode() == KeyEvent.KEYCODE_ENTER) {
            onSearchAction(v);
            return true;
        }
        // Return true if you have consumed the action, else false.
        return false;
    }
});

Update: Der obige Code würde den Rückruf einige Male zweimal aktivieren. Stattdessen habe ich mich für den folgenden Code entschieden, den ich von den Google-Chat-Clients erhalten habe:

public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
    // If triggered by an enter key, this is the event; otherwise, this is null.
    if (event != null) {
        // if shift key is down, then we want to insert the '\n' char in the TextView;
        // otherwise, the default action is to send the message.
        if (!event.isShiftPressed()) {
            if (isPreparedForSending()) {
                confirmSendMessageIfNeeded();
            }
            return true;
        }
        return false;
    }

    if (isPreparedForSending()) {
        confirmSendMessageIfNeeded();
    }
    return true;
}
191
Thomas Ahle

Probieren Sie es aus, es sollte für das funktionieren, was Sie brauchen: 


editText.setOnEditorActionListener(new EditText.OnEditorActionListener() {
    @Override
    public boolean onEditorAction(EditText v, int actionId, KeyEvent event) {
    if (actionId == EditorInfo.IME_ACTION_DONE) {
       //do here your stuff f
       return true;
    }
    return false;
    } 
});
93
chikka.anddev
   <EditText Android:imeOptions="actionDone" 
    Android:inputType="text"/>

dann ist Java-Code,

    edittext.setOnEditorActionListener(new OnEditorActionListener() { 

    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {

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

         Log.i(TAG,"Here you can write the code");

         return true;

        }    
        return false;
    }
    });
24
Vinoj Vetha

Ich weiß, dass diese Frage alt ist, aber ich möchte darauf hinweisen, was für mich funktioniert hat.

Ich habe versucht, den Beispielcode von der Android Developers-Website (siehe unten) zu verwenden, aber es hat nicht funktioniert. Also habe ich die EditorInfo-Klasse überprüft und festgestellt, dass der Ganzzahlwert IME_ACTION_SEND als 0x00000004 angegeben wurde.

Beispielcode von Android-Entwicklern:

editTextEmail = (EditText) findViewById(R.id.editTextEmail);
editTextEmail
        .setOnEditorActionListener(new OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView v, int actionId,
                    KeyEvent event) {
                boolean handled = false;
                if (actionId == EditorInfo.IME_ACTION_SEND) {
                    /* handle action here */
                    handled = true;
                }
                return handled;
            }
        });

Also habe ich den Integer-Wert zu meiner res/values/integers.xml-Datei hinzugefügt.

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <integer name="send">0x00000004</integer>
</resources>

Dann habe ich meine Layoutdatei res/layouts/activity_home.xml wie folgt bearbeitet

<EditText Android:id="@+id/editTextEmail"
  Android:layout_width="match_parent"
  Android:layout_height="wrap_content"
  Android:imeActionId="@integer/send"
  Android:imeActionLabel="@+string/send_label"
  Android:imeOptions="actionSend"
  Android:inputType="textEmailAddress"/>

Und dann hat der Beispielcode funktioniert.

24
iRuth

Während die meisten Leute die Frage direkt beantwortet haben, wollte ich das Konzept dahinter näher erläutern. Zuerst wurde ich auf IME aufmerksam gemacht, als ich eine Standard-Login-Aktivität erstellte. Es generierte Code für mich, der Folgendes enthielt:

<EditText
  Android:id="@+id/password"
  Android:layout_width="match_parent"
  Android:layout_height="wrap_content"
  Android:hint="@string/Prompt_password"
  Android:imeActionId="@+id/login"
  Android:imeActionLabel="@string/action_sign_in_short"
  Android:imeOptions="actionUnspecified"
  Android:inputType="textPassword"
  Android:maxLines="1"
  Android:singleLine="true"/>

Sie sollten bereits mit dem Attribut inputType vertraut sein. Dadurch wird Android lediglich über die Art des erwarteten Textes informiert, beispielsweise eine E-Mail-Adresse, ein Kennwort oder eine Telefonnummer. Die vollständige Liste der möglichen Werte finden Sie hier

Es war jedoch das Attribut imeOptions="actionUnspecified", dass ich seinen Zweck nicht verstand. Android ermöglicht die Interaktion mit der Tastatur, die am unteren Bildschirmrand eingeblendet wird, wenn mit InputMethodManager Text ausgewählt wird. In der unteren Ecke der Tastatur befindet sich eine Schaltfläche. Normalerweise wird je nach aktuellem Textfeld "Next" oder "Done" angezeigt. In Android können Sie dies mit Android:imeOptions anpassen. Sie können eine Schaltfläche "Senden" oder "Weiter" angeben. Die vollständige Liste finden Sie hier .

Damit können Sie dann auf Druck auf die Aktionstaste achten, indem Sie einen TextView.OnEditorActionListener für das EditText-Element definieren. Wie in deinem Beispiel:

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

Jetzt hatte ich in meinem Beispiel das Android:imeOptions="actionUnspecified"-Attribut. Dies ist nützlich, wenn Sie versuchen möchten, einen Benutzer anzumelden, wenn er die Eingabetaste drückt. In Ihrer Aktivität können Sie dieses Tag erkennen und dann das Login versuchen:

    mPasswordView = (EditText) findViewById(R.id.password);
    mPasswordView.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView textView, int id, KeyEvent keyEvent) {
            if (id == R.id.login || id == EditorInfo.IME_NULL) {
                attemptLogin();
                return true;
            }
            return false;
        }
    });
16
Donato

Weitere Informationen zum Einrichten des OnKeyListener und zum Abhören der Schaltfläche Done.

Fügen Sie zunächst OnKeyListener zum Abschnitt implements Ihrer Klasse hinzu. Fügen Sie dann die in der OnKeyListener-Schnittstelle definierte Funktion hinzu:

/*
 * Respond to soft keyboard events, look for the DONE press on the password field.
 */
public boolean onKey(View v, int keyCode, KeyEvent event)
{
    if ((event.getAction() == KeyEvent.ACTION_DOWN) &&
        (keyCode == KeyEvent.KEYCODE_ENTER))
    {
        // Done pressed!  Do something here.
    }
    // Returning false allows other listeners to react to the press.
    return false;
}

Ein EditText-Objekt gegeben:

EditText textField = (EditText)findViewById(R.id.MyEditText);
textField.setOnKeyListener(this);
14
Robert Hawkey

Dank an chikka.anddev in Kotlin ist es:

text.setOnEditorActionListener { v, actionId, event ->
    if (actionId == EditorInfo.IME_ACTION_DONE) {
        button.performClick()
        [email protected] true
    }
    [email protected] false
}
0
CoolMind