按钮上有多个点击监听器

8

我想知道如何在XML中定义的按钮上添加多个点击事件,以前在Java中,我们实现了View.onClickListener接口,并在onClick方法中完成了其余工作。
例如:

@Override
public void onClick(View v) {

switch (v.getId()) {

    case R.id.oneButton:
        // do your code
        break;

    case R.id.twoButton:
        // do your code
        break;

    case R.id.threeButton:
        // do your code
        break;

    default:
        break;
    }

}

我正在使用新的 Kotlin 制作一个基本计算器应用程序,但似乎 Kotlin 没有这样的规定,相反,我的代码看起来太长而冗长,因为我需要将事件分别附加到所有按钮上。
有人可以告诉我如何在 Kotlin 中做同样的事情吗?谢谢


你可以尝试将这段代码复制到Android Studio中,看看会得到什么。 - BakaWaii
7个回答

10

对于在kotlin中(版本:1.1.60)有多个 onClickListeners 的情况,以下内容对我有帮助。希望对其他人也有用。

像这样将 OnClickListener 实现到活动中:

class YourActivity : AppCompatActivity(), View.OnClickListener

onCreate()方法中设置按钮:

val button = findViewById<Button>(R.id.buttonId)

onCreate()中为按钮指定onclick

button.setOnClickListener { onClick(button) }

onClick()的覆盖方法中:

 override fun onClick(v: View) {
    when (v.id) {
        R.id.buttonId -> { //your code  }
        ..
        ..
        ..
        else -> { //your code  }
   }
 }

6

是的,在 Kotlin 中,您可以像这样操作:

view.setOnClickListener(object : View.OnClickListener {
    override fun onClick(v: View?) {
        when(v?.id) {
            R.id.imgBack -> {/* do your code */}
            R.id.twoButton -> {/* do your code */}
            R.id.threeButton -> {/* do your code */}
            else -> {/* do your code */}
        }
    }
}

我已经尝试过了,但视图对象无法转换为按钮。您能否发布声明视图对象的完整代码?谢谢。 - Anand Rajput
1
这似乎是最符合 Kotlin 风格的写法,但代码无法编译。when 语句需要使用 !! 或 ? 处理可空类型。在我的情况下,我选择抛出异常,所以该行应为 when(v!!.id) { - SMBiggs
1
@SMBiggs 哦,没错。刚刚意识到了。你可以为v添加一个空值检查器,像这样 when(v?.id) {。我已经更新了答案。谢谢! - Kharda

5
你可以尝试以下代码:
class Testing:AppCompatActivity(), View.OnClickListener {
  private val mButton1:Button
  private val mButton2:Button
  protected fun onCreate(savedInstanceState:Bundle) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_testing)
    mButton1 = findViewById(R.id.btn_click) as Button
    mButton2 = findViewById(R.id.btn_click1) as Button
    mButton1.setOnClickListener(this)
    mButton2.setOnClickListener(this)
  }
  fun onClick(view:View) {
    when (view.getId()) {
      R.id.btn_click -> {
        Toast.makeText(this, "button 1", Toast.LENGTH_SHORT).show()
      }
      R.id.btn_click1 -> {
        Toast.makeText(this, "button 2", Toast.LENGTH_SHORT).show()
      }
      else -> {}
    }
  }
}

我希望这能对你有所帮助。

在Java中,我会这样声明按钮:Button btn1, btn2;,那么在Kotlin中如何在一行中声明多个按钮? - Vivek Thummar
1
使用这种语法是不被鼓励的,因此一些新的编程语言如 Kotlin 甚至不允许它们。 - rockstar

4

首先在你的Activity中实现OnClickListener,例如:

class MainActivity : Activity , OnClickListener

然后覆盖它的实现,如下所示:
func onClick(v:View) {  
   //use when here like
   case R.id.youview -> {
   // do your work on click of view
    }

不要忘记在你的View上设置点击监听器。

  yourView.setOnClickListener(this)

或者更好的理解方式是逐步进行 -

  1. 在您的Activity中实现OnClickListener

  2. 编译器将要求您实现重写的方法。请实现这些方法。

  3. 复制粘贴您在onClick方法中编写的java代码,该代码可以被kotlin自己转换,或者编写when条件。


在Java中,我们可以这样做 - case R.id.oneButton: case R.id.twoButton: // do your code break; 当我们有两个不同的按钮执行相同的任务时,那么在Kotlin中我们该如何实现呢? - Vivek Thummar
好的,我找到了在 Kotlin 中实现相同功能的方法:case R.id.oneButton, case R.id.twoButton ->,然后就完成了... - Vivek Thummar

2

这段代码对我有效:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    imgBack.setOnClickListener(this)
    twoButton.setOnClickListener(this)
    threeButton.setOnClickListener(this)
}

override fun onClick(view:View) {
    when (view.id) {
        R.id.imgBack -> {
            Toast.makeText(this, "imgBack", Toast.LENGTH_SHORT).show()
        }
        R.id.twoButton -> {
            Toast.makeText(this, "twoButton", Toast.LENGTH_SHORT).show()
        }
        else -> {}
    }
}

不要忘记在你的类中实现 View.OnClickListener 接口。

0

你可以从接口View.ClickListener创建匿名对象,并将其传递给setOnClickListener函数

private val clickListener = View.OnClickListener { p0 ->
    when (p0.id) {
        ....
    }
}

... setOnClickListener(clickListener)

-1

3
问题询问的是 Kotlin,而你给出了 Java 的答案。 - Arnold Brown

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接