【问题标题】:Listener for Done button on EditText? [duplicate]EditText 上的“完成”按钮的侦听器? [复制]
【发布时间】:2011-08-06 08:39:39
【问题描述】:

如果我有一个 EditText,并且我想听听用户是否按下了键盘上的“完成”按钮。我该怎么做?

【问题讨论】:

  • 要考虑的一点,手机可能有物理键盘,所以用户可能永远不会按键盘上的done键,你有没有想过基于失焦或者editText编辑端来做你的操作?

标签: java android kotlin


【解决方案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.onClickKeyboardDoneButton{myFunctionToExecuteWhenUserClickDone()}

【讨论】:

    【解决方案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")
        }
        

        【讨论】:

          猜你喜欢
          • 2015-07-31
          • 1970-01-01
          • 2012-12-22
          • 1970-01-01
          • 1970-01-01
          • 2014-02-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多