如何使用 Kotlin 设置 OnEditorActionListener

新手上路,请多包涵

所以我有这个 Java 代码:

 editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        if (actionId == EditorInfo.IME_ACTION_DONE) {
            doSomething();
            return true;
        }
        return false;
    }
});

我已经设法得到这个(我什至不确定这是正确的方法):

 editText.setOnEditorActionListener() { v, actionId, event ->
      if(actionId == EditorInfo.IME_ACTION_DONE){
          doSomething()
      } else {
      }
}

但是我得到一个错误 Error:(26, 8) Type mismatch: inferred type is kotlin.Unit but kotlin.Boolean was expected

那么这样的事件处理程序是如何用 Kotlin 编写的呢?

原文由 Pier 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

onEditorAction 返回一个 Boolean 而你的 Kotlin lambda 返回 Unit 。将其更改为:

 editText.setOnEditorActionListener { v, actionId, event ->
      if(actionId == EditorInfo.IME_ACTION_DONE){
          doSomething()
          true
      } else {
          false
      }
}

关于 lambda 表达式和匿名函数 的文档 是一本很好的读物。

原文由 miensol 发布,翻译遵循 CC BY-SA 4.0 许可协议

Kotlin 使用 when 关键字会很棒,而不是使用 if else

对我来说,下面的代码更漂亮:

 editText.setOnEditorActionListener { v, actionId, event ->
  when(actionId){
      EditorInfo.IME_ACTION_DONE -> {
            doSomething()
            true
      }
      else -> false
  }
}

p/s: @Pier 的代码不工作,因为 lambda 的右侧需要一个表达式。所以,我们必须使用 true/false 而不是 return true/false

原文由 topcbl 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题