【问题标题】:How to solve this Error:Unresolved reference: text which is related to scope in Kotlin?如何解决此错误:未解决的参考:与 Kotlin 中的范围相关的文本?
【发布时间】:2021-09-26 09:33:26
【问题描述】:

我想要达到的目标:

我想获取按钮文本作为函数的参数

我想要什么:

// Operators - setOnClickListener
btnDivide.setOnClickListener { viewModel.mountOperator(it.text) }
btnMultiply.setOnClickListener { viewModel.mountOperator(it.text) }
btnMinus.setOnClickListener { viewModel.mountOperator(it.text) }
btnPlus.setOnClickListener { viewModel.mountOperator(it.text) }

什么是有效的:

// Operators - setOnClickListener
btnDivide.setOnClickListener { viewModel.mountOperator(btnDivide.text) }
btnMultiply.setOnClickListener { viewModel.mountOperator(btnMultiply.text) }
btnMinus.setOnClickListener { viewModel.mountOperator(btnMinus.text) }
btnPlus.setOnClickListener { viewModel.mountOperator(btnPlus.text) }

出现的问题:

错误:Unresolved reference: text,当我在做 it.text
但是在 setOnClickListener{ it: View! } 中,我看到了这个预览,就像它通常显示的那样。所以我想,这里it 指的是我设置onClickListener 的按钮。

如果对问题有任何困惑,请在评论中写下。如果我的方法有误,请在 cmets 中分享

【问题讨论】:

    标签: android kotlin android-fragments


    【解决方案1】:

    所以我想,这里指的是我设置 onClickListener 的按钮。

    这里,itView 类型而不是 Button 类型,或者您希望它是任何类型的特定视图类型,因为并非所有视图都有 @ 987654324@ 属性(这意味着View 没有名为text 的东西,但Button 可能),你可以使用这样的东西:

     btnDivide.setOnClickListener { viewModel.mountOperator((it as Button).text) } 
    

    您可以将Button 替换为任何类型的视图。

    it as Button 正在将 View 投射到我们的特定类型中,在你的情况下,我假设这将是一个按钮,但你可以将它投射到它实际的任何类型的视图。


    it: View! 此处确实指的是您将 onClickListener 设置为的按钮,但它以View 的形式返回给您,而不是更具体的类型

    【讨论】:

      【解决方案2】:

      还要跟进@a_local_nobody 的回答,它只是传入通用View 而不是您设置点击侦听器的类型,是因为您可以创建单个侦听器对象/函数并重用它对于所有需要处理点击的事情(可能是View 的不同子类)

      因此,如果您愿意,可以制作其中一个并使用它,而不是为每个按钮重复代码:

      fun handleButtonClick(view: View) {
          if (view is Button) viewModel.mountOperator(view.text)
      }
      
      btnDivide.setOnClickListener { handleButtonClick(it) }
      // or as a function reference
      btnMultiply.setOnClickListener(::handleButtonClick)
      

      当您分配多个相同的点击侦听器(或对一堆事情执行相同的任何操作)时,您可以做的另一件事就是执行一个循环

      listOf(btnDivide, btnMultiply, btnMinus, btnPlus).forEach {
          it.setOnClickListener { //bla bla }
      }
      

      这适用于重用函数引用或只是为每个侦听器创建一个新的引用(就像您在问题中所做的那样) - 它只是节省您重复自己,它可以更容易阅读,如果您需要制作只需在一个地方进行更改

      【讨论】:

        猜你喜欢
        • 2018-10-16
        • 1970-01-01
        • 1970-01-01
        • 2021-09-27
        • 1970-01-01
        • 1970-01-01
        • 2018-10-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多