【发布时间】:2011-08-06 08:39:39
【问题描述】:
如果我有一个 EditText,并且我想听听用户是否按下了键盘上的“完成”按钮。我该怎么做?
【问题讨论】:
-
要考虑的一点,手机可能有物理键盘,所以用户可能永远不会按键盘上的done键,你有没有想过基于失焦或者editText编辑端来做你的操作?
如果我有一个 EditText,并且我想听听用户是否按下了键盘上的“完成”按钮。我该怎么做?
【问题讨论】:
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;
}
});
【讨论】:
代码是
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
【讨论】:
在 Kotlin 中处理 done 动作的基本方式是:
edittext.setOnEditorActionListener { _, actionId, _ ->
if (actionId == EditorInfo.IME_ACTION_DONE) {
// Call onDone result here
true
}
false
}
使用它在您的主代码中调用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"支持,read this post
【讨论】:
根据 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()}
【讨论】:
same 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;
});
【讨论】:
这个 Kotlin 版本应该适用于所有设备:
editText.setOnEditorActionListener { _, actionId, _ ->
if (actionId == EditorInfo.IME_ACTION_DONE) {
// Do something
true
} else {
false
}
}
【讨论】:
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")
}
【讨论】: