【问题标题】:How to properly use setOnLongClickListener() with Kotlin如何在 Kotlin 中正确使用 setOnLongClickListener()
【发布时间】:2018-04-07 22:39:43
【问题描述】:

我一直在尝试设置长点击监听事件,但不断收到以下错误:

Type mismatch. 

Required:Boolean

Found:Unit

setOnClickListener 事件我没有遇到任何问题,但由于某种原因,我对setOnLongClickListener 事件的运气为零。

我目前正在尝试显示一个简单的Toast

view.setOnLongClickListener{
    Toast.makeText(this, "Long click detected", Toast.LENGTH_SHORT).show();
}

我已经看到很多 Java 示例,但我还没有找到任何 Kotlin 示例。

【问题讨论】:

    标签: android kotlin onlongclicklistener


    【解决方案1】:

    OnLongClickListener.onLongClick 签名要求您返回一个布尔值以通知您是否实际消费了该事件

    view.setOnLongClickListener{
         Toast.makeText(this, "Long click detected", Toast.LENGTH_SHORT).show()
         return@setOnLongClickListener true
    }
    

    view.setOnLongClickListener{
         Toast.makeText(this, "Long click detected", Toast.LENGTH_SHORT).show()
         true
    }
    

    【讨论】:

    • 很好的答案我们想添加一个想法,当您尝试构建这个时,编译器会抱怨如果在打开和关闭之间的任何其他代码行之前没有添加 return 或 true 语句对初学者来说否则新手会认为输入的内容是错误的只是一个想法
    • 谢谢你塞缪尔
    • 请记住,您可以通过使用 Kotlin 函数内部的“it”变量来访问侦听器传递的视图
    • 对我来说,它用红色标记了我的 if/else 结构,所以我认为我没有写出正确的比较。有一段时间真的很困惑,花了 20 分钟重新输入我的括号以确保它们是正确的(它们是正确的)。
    【解决方案2】:

    另一种方式可以是这样......

    view.setOnLongClickListener{
        dispathAnEventOnLongClick("Long click detected!");
    }
    private fun dispathAnEventOnLongClick(text:CharSequence): Boolean {
        Toast.makeText(applicationContext,text,Toast.LENGTH_SHORT).show();
        return true;
    }
    

    【讨论】:

      【解决方案3】:

      内联函数

      您可以创建一个使用函数并返回布尔值的内联函数。然后将它与任何需要布尔值作为返回类型的函数一起使用。

      在 kotlin 文件中:

      inline fun consume(function: () -> Unit): Boolean {
          function()
          return true
      }
      

      用法:

      view.setOnLongClickListener {
         consume { Toast.makeText(context, "Long click detected", Toast.LENGTH_SHORT).show() }
      }
      

      现在您的代码将工作并返回一个真值以满足setOnLongClickListener 方法的需要。您可以将此函数consume 与任何需要真值的函数(如onCreateOptionsMenuonOptionsItemSelected)重用,而无需明确需要返回真值。

      这种方式使用:Inline Functions。您检查为最佳答案的解决方案使用:Labeled Return

      【讨论】:

        【解决方案4】:

        我确实喜欢这个。

        在 onCreate 中,

            findViewById<Button>(R.id.myButton).setOnLongClickListener(myButtonLongClickListener)
        

        然后,

        private var timeButtonLongClickListener = View.OnLongClickListener {
            true
        }
        

        【讨论】:

          【解决方案5】:

          这个也适用于 Kotlin。只需返回 true

          view.setOnLongClickListener {
              Toast.makeText(this,"This is a long click",Toast.LENGTH_SHORT).show(); 
              true
          }
          

          【讨论】:

          • 您可以将代码块用于代码部分,这将使您的问题/答案很棒。
          • 我相信您的解决方案与公认的解决方案相同。
          猜你喜欢
          • 2018-01-28
          • 2018-01-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-08-05
          • 1970-01-01
          • 2018-12-05
          • 1970-01-01
          相关资源
          最近更新 更多