如何使用 kotlin 以单一方法获取 android 屏幕上按钮的所有事件?

How can I get all the events of the buttons on a screen on android in a single method using the kotlin?

我正在为 android 学习使用 kotlin 开发一个计算器。 要向用户获取数字 select,我需要设置以下代码:

btn1.setOnClickListener({
            var texto = txtDisplay.text.toString()
            txtDisplay.setText(texto + "1")
        })
        btn2.setOnClickListener({
            var texto = txtDisplay.text.toString()
            txtDisplay.setText(texto + "2")
        })
        btn3.setOnClickListener({
            var texto = txtDisplay.text.toString()
            txtDisplay.setText(texto + "3")
        })
        btn4.setOnClickListener({
            var texto = txtDisplay.text.toString()
            txtDisplay.setText(texto + "4")
        })
        btn5.setOnClickListener({
            var texto = txtDisplay.text.toString()
            txtDisplay.setText(texto + "5")
        })
        btn6.setOnClickListener({
            var texto = txtDisplay.text.toString()
            txtDisplay.setText(texto + "6")
        })
        btn7.setOnClickListener({
            var texto = txtDisplay.text.toString()
            txtDisplay.setText(texto + "7")
        })
        btn8.setOnClickListener({
            var texto = txtDisplay.text.toString()
            txtDisplay.setText(texto + "8")
        })
        btn9.setOnClickListener({
            var texto = txtDisplay.text.toString()
            txtDisplay.setText(texto + "9")
        })
        btn0.setOnClickListener({
            var texto = txtDisplay.text.toString()
            txtDisplay.setText(texto + "0")
        })

是否可以将所有按钮的事件处理集中在单个 class 或方法中?

我想一个通用的解决方案来减少代码

有人知道解决办法吗?

一种方法是为点击侦听器创建一个新的 class:

private class MyButtonClickListener(
            private var txtDisplay: TextView, private var s: String
            ) : View.OnClickListener {
        override fun onClick(v: View?) {
            txtDisplay.text = txtDisplay.text.toString() + s
        }
    }

然后将其用作:

btn1.setOnClickListener(MyButtonClickListener(txtDisplay, "1"))
btn2.setOnClickListener(MyButtonClickListener(txtDisplay, "2"))

等等..

创建一个按钮数组然后你就可以使用这个循环

for (i in 0..9) {
    btn[i].setOnClickListener({
        var texto = txtDisplay.text.toString()
        txtDisplay.text = texto + i.toString()
    })
}

我建议使用这种方法来设置 onClick 侦听器。

1.Create onClick 侦听器:

private class MyButtonClickListener(
        private var txtDisplay: TextView, private var s: String
        ) : View.OnClickListener {
    override fun onClick(v: View?) {
        txtDisplay.text = txtDisplay.text.toString() + s
    }
}

2.And 然后对按钮使用迭代并对它们应用 onClick 侦听器:

val btns = arrayOf(btOne, btTwo, btThree, ...)
for(int i = 1; i <= btns.size; ++i) {
    btns[i].setOnClickListener(MyButtonClickListener(txtDisplay, "$i"))
}

这是在 kotlin 中处理点击事件的标准方式。 在 Class 中创建函数点击监听器。在 onCreate 函数中调用此函数。

 private fun clickListeners()
 {
 btn1.setOnClickListener(this)

 btn2.setOnClickListener(this)
 }

将 OnclickListner 扩展到您的 Activity/Fragment。

 class A: AppCompatActivity(),View.OnClickListener{
   override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
   // call onclick listener function 
    clickListeners()
 
}
  }

然后覆盖 onClick 函数并编写您的 onClick 逻辑。

   override fun onClick(v: View?) {

    when (v?.id) {

        R.id.btn1-> {
            txtDisplay.text = txtDisplay.text.toString() +"1"
        }
         R.id.btn2-> {
            txtDisplay.text = txtDisplay.text.toString() +"2"
        }
      }
    }