Android | Handling Click Events Kotlin's Way

Listening to a button clicks is a common task in application development. A listener is set to listen and act upon click events. OnClickListener is an interface used to listen to click events of a button or any other components of type View.
View & Click Listener
- View is the basic building block for UI components.
- Views can register or set listeners that will be notified when an event happens to the view.
- Components of type
Viewcan set click listener that get notified on click event. setOnClickListener(OnClickListener l)is used to set the click listener.- Click listener is an instance of type
OnClickListener.
View.java
public void setOnClickListener(OnClickListener l) { .... }
OnClickListeneris an interface with a single abstract method “SAM”.
public interface OnClickListener {
void onClick(View v);
}
- So, we need to pass an instance of type
OnClickListenertosetOnClickListener()function. - We can achieve this in the following ways.
( 1 ) The simplest old way, implement OnClickListener interface
- The simplest way to create an instance of type
OnClickListeneris by implementing it. - Our activity can implement the interface
OnClickListenerand overrideonClick().
// 1. extend View.OnClickListener
class MainActivity : AppCompatActivity(), View.OnClickListener {
private lateinit var textView:TextView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val button = findViewById<Button>(R.id.button)
textView = findViewById<TextView>(R.id.textView)
// 2. pass this as instance of OnClickListener
button.setOnClickListener(this)
}
// 3. override onClick()
override fun onClick(v: View?) {
textView.setText("Clicked!")
}
}
( 2 ) Use object expression
- Use object expression to create an instance from an anonymous class implementing
OnClickListener.
class MainActivity : AppCompatActivity() {
private lateinit var textView:TextView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val button = findViewById<Button>(R.id.button)
textView = findViewById<TextView>(R.id.textView)
// create an instance from anonymous class
button.setOnClickListener{
object: View.OnClickListener{
override fun onClick(v: View?) {
textView.setText("Clicked!")
}
}
}
}
}
( 3 ) Lambda
- Since
OnClickListeneris an interface with a single abstract function, we can use lambda. - The
onClick()function takes a parameter of typeViewand returns void or Unit for Kotlin. - So, the function type of the lambda should be
(View) -> Unit
class MainActivity : AppCompatActivity() {
private lateinit var textView:TextView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val button = findViewById<Button>(R.id.button)
textView = findViewById<TextView>(R.id.textView)
// create an instance from anonymous class
button.setOnClickListener{ v -> textView.setText("Clicked!") }
}
}
- Or, even simpler
button.setOnClickListener{ textView.setText("Clicked!") }