按钮上的多个点击监听器

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中以同样的方式进行?谢谢

1 个评论
你可以试着把这段代码复制到Android Studio,看看你会得到什么。
java
android
button
onclick
kotlin
Anand Rajput
Anand Rajput
发布于 2017-08-09
7 个回答
Sudheesh R
Sudheesh R
发布于 2017-08-09
已采纳
0 人赞同

For multiple onClickListeners in kotlin (version:1.1.60) , the following helped me. Hope it'll be useful to someone else too.

落实 OnClickListener 的活动,如。

class YourActivity : AppCompatActivity(), View.OnClickListener

set your button in onCreate():

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

并将onclick分配给onCreate()中的按钮。

button.setOnClickListener { onClick(button) }

以及onClick()的覆盖方法中。

 override fun onClick(v: View) {
    when (v.id) {
        R.id.buttonId -> { //your code  }
        else -> { //your code  }
    
Kharda
Kharda
发布于 2017-08-09
0 人赞同

是的,在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 */}
    
我已经试过了,但视图对象不能被转换为Button。你能贴出声明视图对象的完整代码吗?谢谢
这似乎是最 "kotlinish "的,但代码无法编译。 替换代码0】语句需要用!!或?来处理nullable。 在我的例子中,我选择了抛出一个异常,所以这一行应该是 when(v!!.id) {
@SMBiggs 哦,是的,你是对的。只是意识到这一点。你可以为v添加一个空检查器,比如 when(v?.id) { 。我已经更新了答案。谢谢!
rockstar
rockstar
发布于 2017-08-09
0 人赞同

你可以试试下面这段代码。

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 -> {}

I hope this is help you.

在java中我是这样声明按钮的。 Button btn1, btn2; ,在kotlin中我如何在一行中声明多个按钮?
不鼓励使用这种语法,因此一些较新的语言如 Kotlin甚至不允许他们 .
Rahul
Rahul
发布于 2017-08-09
0 人赞同

首先在你的 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

Don't forgot to set clicklistener on your View.

  yourView.setOnClickListener(this)

或者为了更好地理解,一步一步地走下去 -

  • Implement OnClickListener in your Activity.

  • 编译器会要求你实现重写方法。实现这些方法。

  • 复制粘贴你写在onClick方法中的java代码,这可以由kotlin自己转换,或者写下when条件。

  • 在java中,当我们为同一个任务有两个不同的按钮时,我们会做类似于-- case R.id.oneButton: case R.id.twoButton: // do your code break; 的事情,在kotlin中我们如何实现这个目标?
    ohk, I found the way to do the same in kotlin, case R.id.oneButton, case R.id.twoButton -> and it's done...
    Mengheang
    Mengheang
    发布于 2017-08-09
    0 人赞同

    This code worked for me:

    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

    Liubomyr Pavlyk
    Liubomyr Pavlyk
    发布于 2017-08-09
    0 人赞同

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

    private val clickListener = View.OnClickListener { p0 ->
        when (p0.id) {
    ... setOnClickListener(clickListener)
        
    Harshit Trivedi
    Harshit Trivedi
    发布于 2017-08-09
    0 人赞同

    Try below like this.

      public class MainActivity extends Activity implements View.OnClickListener{
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            Button xyz = (Button) findViewById(R.id.xyz);
            xyz.setOnClickListener(this);
        @Override