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上的Android键盘下一个按钮问题

如何使数字的android edittext类似于DatePickerDialog上的向上/向下按钮?

在 Android 的 EditText 中单击 drawableleft 的侦听器?

单选按钮上的动作侦听器