在EditText上监听Done按钮的事件?

96

如果我有一个EditText,想监听用户是否按下键盘上的“完成”按钮...我该如何做到呢?


1
需要考虑的一点是,手机可能有物理键盘,因此用户可能永远不会按下键盘上的完成按钮,您是否考虑过根据焦点丢失或editText编辑结束来执行操作? - blindstuff
可能是重复问题:https://dev59.com/y3I_5IYBdhLWcg3wMf5_#60989441 - android developer
7个回答

166

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

6
这应该被接受作为答案 - 它可以在三星S4上运行。 - Anton Kizema
6
需要在相关的EditText标签中添加 "android:imeOptions="actionDone" ",这样就可以正常工作了。非常感谢! - jwehrle

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即可


6
嗨,Dinash。仅仅发布一个链接通常是不太有帮助的。最好提供一些示例代码来回答提问者的问题,然后再将源文章链接作为参考资料或进一步阅读的链接。 - Chris Salij
嗨,克里斯,我认为你可以从链接本身找到答案,但我仍然会给出一个确切的可用于链接中的工作代码... 代码是final EditText edittext =(EditText)findViewById(R.id.edittext); edittext.setOnKeyListener(new 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。 - Dinash
它无法在自定义键盘上工作。setOnKeyListener将不会在某些自定义键盘上被调用。 - Abeer Iqbal
它对我的某些设备或键盘软件不起作用。 - Chanh
"event.getAction() == KeyEvent.ACTION_DOWN" 已经过时。 - Majid Sadeghi
不适用于三星S20。 - Rowan Berry

24

Kotlin 扩展解决方案

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

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",请阅读此帖子

作为一个提醒,android:imeOptions="actionDone" 并不在所有设备上表现一致,我已经尽可能地避免使用它,因为在激活此选项时,旧设备上的键监听器开始忽略它们。我也发现它可能会将你定位到奇怪的位置,而且它还会捕捉三星S20上的退格键。 - Rowan Berry
2
你应该添加明确的return@setOnEditorActionListener,因为"if"不是最后一条语句。 - CeH9

9

相同的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;
            });

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()}

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

2

这个 Kotlin 版本应该能在所有设备上运行:

最初的回答:

editText.setOnEditorActionListener { _, actionId, _ ->
    if (actionId == EditorInfo.IME_ACTION_DONE) {
        // Do something
        true
    } else {
        false
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接