93

如果我有一个 EditText 并且我想听听用户是否按下了键盘上的“完成”按钮。我该怎么做?

4

7 回答 7

162

Dinash 的回答很好,但它不适用于所有设备。下面的代码适用于所有设备

edittext.setOnEditorActionListener(new TextView.OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        if (actionId == EditorInfo.IME_ACTION_DONE) {
            Toast.makeText(HelloFormStuff.this, edittext.getText(), Toast.LENGTH_SHORT).show();
            return true;
        }
        return false;
    }
});
于 2016-05-14T09:39:38.903 回答
102

代码是

final EditText edittext = (EditText) findViewById(R.id.edittext);
edittext.setOnKeyListener(new View.OnKeyListener() {
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        if (event.getAction() == KeyEvent.ACTION_DOWN && keyCode == KeyEvent.KEYCODE_ENTER) {
            Toast.makeText(HelloFormStuff.this, edittext.getText(), Toast.LENGTH_SHORT).show();
            return true;
        }
        return false;
    }
});

在那个'edittext'是文本字段的ID

查看此链接只需将 setOnKeyListener 设置为您的 editText

于 2011-04-15T13:44:23.033 回答
21

Kotlin 扩展解决方案

在 Kotlin 中处理 done 操作的基本方法是:

edittext.setOnEditorActionListener { _, actionId, _ ->
    if (actionId == EditorInfo.IME_ACTION_DONE) {
        // Call onDone result here
        true
    }
    false
}

Kotlin 扩展

使用它来调用edittext.onDone {/*action*/}您的主代码。使其更具可读性和可维护性

edittext.onDone { submitForm() }

fun EditText.onDone(callback: () -> Unit) {
    // These lines optional if you don't want to set in Xml
    imeOptions = EditorInfo.IME_ACTION_DONE
    maxLines = 1
    setOnEditorActionListener { _, actionId, _ ->
        if (actionId == EditorInfo.IME_ACTION_DONE) {
            callback.invoke()
            true
        }
        false
    }
}

如果不在代码中,请不要忘记将这些选项添加到您的 edittext Xml

<EditText ...
    android:imeOptions="actionDone"
    android:inputType="text"/>

如果您需要inputType="textMultiLine"支持,请阅读这篇文章

于 2020-01-15T23:17:37.377 回答
7

根据 Asad Rao 的响应,我创建了这个 KOTLIN 扩展函数。

fun TextView.onClickKeyboardDoneButton(funExecute: () -> Unit) {
    this.setOnEditorActionListener { _, actionId, _ ->
        when (actionId) {
            EditorInfo.IME_ACTION_DONE -> {
                funExecute.invoke()
                true
            }
            else -> false
        }
    }
}

采用:

myEditText.onClickKeyboardDoneButton{myFunctionToExecuteWhenUserClickDone()}
于 2019-06-13T09:36:55.493 回答
6

相同的Jone答案,但替换了 lambda:

etPointCombatFirst.setOnEditorActionListener((v, actionId, event) -> {
                if (actionId == EditorInfo.IME_ACTION_DONE) {
                    Toast.makeText(HelloFormStuff.this, edittext.getText(), Toast.LENGTH_SHORT).show();
                    return true;
                }
                return false;
            });
于 2017-10-21T04:13:18.673 回答
2

这个 Kotlin 版本应该适用于所有设备:

editText.setOnEditorActionListener { _, actionId, _ ->
    if (actionId == EditorInfo.IME_ACTION_DONE) {
        // Do something
        true
    } else {
        false
    }
}
于 2019-08-30T20:33:02.617 回答
1

Rx 方法来做到这一点:

fun EditText.onImeActionDoneClicks(): Observable<Unit> {
    return Observable.create { emitter ->
        setOnEditorActionListener { _, actionId, _ ->
            if (actionId == EditorInfo.IME_ACTION_DONE) {
                emitter.onNext(Unit)
                true
            } else {
                false
            }
        }
    }
}

compositeDisposable += lastEditText.onImeActionDoneClicks().subscribe {
    toast("onImeDoneClicks")
}
于 2019-07-06T10:11:09.013 回答