EditText 上的“完成”按钮的侦听器? [复制]
Posted
技术标签:
【中文标题】EditText 上的“完成”按钮的侦听器? [复制]【英文标题】:Listener for Done button on EditText? [duplicate] 【发布时间】:2011-08-06 08:39:39 【问题描述】:如果我有一个 EditText,并且我想听听用户是否按下了键盘上的“完成”按钮。我该怎么做?
【问题讨论】:
要考虑的一点,手机可能有物理键盘,所以用户可能永远不会按键盘上的done键,你有没有想过基于失焦或者editText编辑端来做你的操作? 可能重复:***.com/a/60989441/878126 【参考方案1】: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;
);
【讨论】:
这应该被接受 - 它适用于三星 s4 补充:需要在有问题的 EditText 上设置 xml 标签“android:imeOptions="actionDone"”。效果很好 - 谢谢!【参考方案2】:代码是
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
查看此链接Simply set setOnKeyListener to your editText
【讨论】:
你好 Dinash。仅仅发布一个链接通常是没有帮助的。最好提供一些示例代码来回答提问者的问题,然后链接到源文章作为参考或进一步阅读。 嗨,克里斯,尽管您可以从该链接本身找到答案,但我仍然在链接本身中提供了可用的确切工作代码...代码是最终的 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 它不适用于自定义键盘。在某些自定义键盘上不会调用 setOnKeyListener。 它不适用于我的某些设备或键盘软件。 "event.getAction() == KeyEvent.ACTION_DOWN" 已弃用【参考方案3】: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"
支持,read this post
【讨论】:
就像给大家的提示一样,android:imeOptions="actionDone" 并没有在所有设备上统一执行,我已经明确尽可能避免它,因为具有工作键侦听器的旧设备开始忽略它们当它处于活动状态时。我还发现它可以将你带到奇怪的地方,它还可以在三星 S20 上拾取退格键 你应该添加明确的 return@setOnEditorActionListener 因为“如果”不是最后一个语句【参考方案4】:根据 Asad Rao 的回应,我创建了这个 KOTLIN 扩展函数。
fun TextView.onClickKeyboardDoneButton(funExecute: () -> Unit)
this.setOnEditorActionListener _, actionId, _ ->
when (actionId)
EditorInfo.IME_ACTION_DONE ->
funExecute.invoke()
true
else -> false
用途:
myEditText.onClickKeyboardDoneButtonmyFunctionToExecuteWhenUserClickDone()
【讨论】:
【参考方案5】: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;
);
【讨论】:
【参考方案6】:这个 Kotlin 版本应该适用于所有设备:
editText.setOnEditorActionListener _, actionId, _ ->
if (actionId == EditorInfo.IME_ACTION_DONE)
// Do something
true
else
false
【讨论】:
【参考方案7】: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")
【讨论】:
以上是关于EditText 上的“完成”按钮的侦听器? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
如何使数字的android edittext类似于DatePickerDialog上的向上/向下按钮?