Anand Rajput
Anand Rajput

Reputation: 479

Multiple click listeners on buttons

I want to know how to add multiple click events to buttons defined in XML, as previously, in Java, we implemented View.onClickListener interface and did the rest of the work in onClick method.
Example:

@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;
    }

}

I'm making a basic calculator app with the new Kotlin but it seems Kotlin has no such provisions, instead my code looks too long and verbose, as I'm attaching events to all buttons individually.
Can someone tell me how to do the same way in Kotlin? Thanks

Upvotes: 8

Views: 16730

Answers (7)

Liubomyr Pavlyk
Liubomyr Pavlyk

Reputation: 21

you can create anonymous object from an inteface View.ClickListener and pass it to setOnClickListener function

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

... setOnClickListener(clickListener)

Upvotes: 0

Kharda
Kharda

Reputation: 1378

Yes, in Kotlin you can do it like this:

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 */}
        }
    }
}

Upvotes: 6

Sudheesh R
Sudheesh R

Reputation: 1775

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

Implement OnClickListener to activity like:

class YourActivity : AppCompatActivity(), View.OnClickListener

set your button in onCreate():

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

and assign onclick to the button in onCreate():

button.setOnClickListener { onClick(button) }

and in the override method of onClick() :

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

Upvotes: 10

Rahul
Rahul

Reputation: 10635

First of all implement OnClickListener in your Activity, like

class MainActivity : Activity , OnClickListener

then override its implementation like

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)

Or for better understanding go step by step -

  1. Implement OnClickListener in your Activity.

  2. Compiler will ask you to implement overrided methods. Implement those.

  3. Copy paste your java code which you wrote inside onClick method, that can be converted by kotlin itself or write down when conditions.

Upvotes: 4

Mengheang
Mengheang

Reputation: 43

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

Don't forget implement View.OnClickListener in your class.

Upvotes: 2

Harshit Trivedi
Harshit Trivedi

Reputation: 782

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
    public void onClick(View v) { 
    }}

More detailed information at https://androidacademic.blogspot.in/2016/12/multiple-buttons-onclicklistener-android.html

Upvotes: -1

rockstar
rockstar

Reputation: 687

You can try this following code:

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.

Upvotes: 5

Related Questions