如果我有一个 EditText 并且我想听听用户是否按下了键盘上的“完成”按钮。我该怎么做?
问问题
53400 次
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
于 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 回答