Reputation: 1132
I am trying to build a simple calculator app for android using kotlin. But setOnClickListener
is not working while clicking the buttons.
MainActiviy.kt
package com.example.calculator
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.view.View
import android.widget.Button
import android.widget.EditText
import android.widget.TextView
import android.widget.Toast
import kotlinx.android.synthetic.main.activity_main.*
import kotlin.math.log
class MainActivity : AppCompatActivity() {
private lateinit var result:EditText
private lateinit var newNumber:EditText
private lateinit var displayOperation:TextView
private var operand1:Double?=null
private var operand2:Double=0.0
private var pendingOperation ="="
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
result = findViewById(R.id.result)
newNumber=findViewById(R.id.newNumber)
displayOperation=findViewById(R.id.displayOperation)
val button0:Button = findViewById(R.id.button0)
val button1:Button = findViewById(R.id.button1)
val button2:Button = findViewById(R.id.button2)
val button3:Button = findViewById(R.id.button3)
val button5:Button = findViewById(R.id.button5)
val button6:Button = findViewById(R.id.button6)
val button4:Button = findViewById(R.id.button4)
val button7:Button = findViewById(R.id.button7)
val button8:Button = findViewById(R.id.button8)
val button9:Button = findViewById(R.id.button9)
val buttonDot:Button = findViewById(R.id.buttonDot)
val buttonEqual:Button = findViewById(R.id.buttonEqual)
val buttonAdd:Button = findViewById(R.id.buttonAdd)
val buttonSub:Button = findViewById(R.id.buttonSub)
val buttonMul:Button = findViewById(R.id.buttonMul)
val buttonDiv:Button = findViewById(R.id.buttonDiv)
val listener = View.OnClickListener { v->
val b = v as Button
newNumber.append(b.text)
}
button0.setOnClickListener { listener }
button1.setOnClickListener { listener }
button2.setOnClickListener { listener }
button3.setOnClickListener { listener }
button4.setOnClickListener { listener }
button5.setOnClickListener { listener }
button6.setOnClickListener { listener }
button7.setOnClickListener { listener }
button8.setOnClickListener { listener }
button9.setOnClickListener { listener }
buttonDot.setOnClickListener { listener }
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:id="@+id/button0"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:clickable="true"
android:minWidth="48dp"
android:text="0"
app:layout_constraintStart_toStartOf="@+id/button1"
app:layout_constraintTop_toBottomOf="@+id/button1" />
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:minWidth="48dp"
android:text="1"
app:layout_constraintStart_toStartOf="@+id/button4"
app:layout_constraintTop_toBottomOf="@+id/button4" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:minWidth="48dp"
android:text="2"
app:layout_constraintBaseline_toBaselineOf="@+id/button1"
app:layout_constraintStart_toEndOf="@+id/button1" />
<Button
android:id="@+id/button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:minWidth="48dp"
android:text="3"
app:layout_constraintBaseline_toBaselineOf="@+id/button2"
app:layout_constraintStart_toEndOf="@+id/button2" />
<Button
android:id="@+id/button8"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:minWidth="48dp"
android:text="8"
app:layout_constraintBaseline_toBaselineOf="@+id/button7"
app:layout_constraintStart_toEndOf="@+id/button7" />
<Button
android:id="@+id/button6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:minWidth="48dp"
android:text="6"
app:layout_constraintBaseline_toBaselineOf="@+id/button5"
app:layout_constraintStart_toEndOf="@+id/button5" />
<Button
android:id="@+id/button4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:minWidth="48dp"
android:text="4"
app:layout_constraintStart_toStartOf="@+id/button7"
app:layout_constraintTop_toBottomOf="@+id/button7" />
<Button
android:id="@+id/button5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:minWidth="48dp"
android:text="5"
app:layout_constraintBaseline_toBaselineOf="@+id/button4"
app:layout_constraintStart_toEndOf="@+id/button4" />
<Button
android:id="@+id/button7"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:minWidth="48dp"
android:text="7"
app:layout_constraintStart_toStartOf="@+id/newNumber"
app:layout_constraintTop_toBottomOf="@+id/newNumber" />
<Button
android:id="@+id/button9"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:minWidth="48dp"
android:text="9"
app:layout_constraintBaseline_toBaselineOf="@+id/button8"
app:layout_constraintStart_toEndOf="@+id/button8" />
<Button
android:id="@+id/buttonDot"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:minWidth="48dp"
android:text="."
app:layout_constraintBaseline_toBaselineOf="@+id/button0"
app:layout_constraintStart_toEndOf="@+id/button0" />
<Button
android:id="@+id/buttonEqual"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:minWidth="48dp"
android:text="="
app:layout_constraintBaseline_toBaselineOf="@+id/buttonDot"
app:layout_constraintStart_toEndOf="@+id/buttonDot" />
<Button
android:id="@+id/buttonAdd"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:minWidth="48dp"
android:text="+"
app:layout_constraintBaseline_toBaselineOf="@+id/buttonEqual"
app:layout_constraintStart_toEndOf="@+id/buttonEqual" />
<Button
android:id="@+id/buttonDiv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:minWidth="48dp"
android:text="/"
app:layout_constraintBaseline_toBaselineOf="@+id/button9"
app:layout_constraintStart_toEndOf="@+id/button9" />
<Button
android:id="@+id/buttonMul"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:minWidth="48dp"
android:text="*"
app:layout_constraintBaseline_toBaselineOf="@+id/button6"
app:layout_constraintStart_toEndOf="@+id/button6" />
<Button
android:id="@+id/buttonSub"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:minWidth="48dp"
android:text="-"
app:layout_constraintBaseline_toBaselineOf="@+id/button3"
app:layout_constraintStart_toEndOf="@+id/button3" />
<TextView
android:id="@+id/displayOperation"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:textSize="18sp"
android:textStyle="bold"
app:layout_constraintBaseline_toBaselineOf="@+id/newNumber"
app:layout_constraintEnd_toStartOf="@+id/newNumber"
app:layout_constraintStart_toStartOf="parent" />
<EditText
android:id="@+id/result"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:ems="10"
android:focusable="false"
android:focusableInTouchMode="false"
android:inputType="numberSigned|numberDecimal"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<EditText
android:id="@+id/newNumber"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:ems="10"
android:inputType="numberSigned|text|numberDecimal"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/result" />
</androidx.constraintlayout.widget.ConstraintLayout>
Upvotes: 0
Views: 3669
Reputation: 167
If you really do not want to implement View.OnClickListener
you just need to trigger your local listener
on button click.
e.g. for button0
make it
button0.setOnClickListener { listener.onClick(it) }
Data binding can reduce the findViewById
lines. My latest environment provides data binding for kotlin by default.
Upvotes: 1
Reputation: 435
This is because you're not setting any listener to the buttons, but you're defining new listeners that don't invoke any method
This will work:
button.setOnClickListener(listener)
This will work too, but here you have 2 listeners: the original one invoked by another one:
button.setOnClickListener{ listener.onClick(it) }
Upvotes: 1
Reputation: 6981
first of all, you don't need to use findViewById in Kotlin. You can use it directly using id you provide in xml.
- Use click listener like below
button6.setOnClickListener(object :View.OnClickListener{
// do button click
})
- For multiple button click you can implement View.OnClickListener in activity and use it like.
class MainActivity : AppCompatActivity(),View.OnClickListener {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
button6.setOnClickListener = this
}
override fun onClick(v: View?) {
when (v?.id) {
R.id.button6 -> {
// do button click
}
}
}
}
If you don't want to set setOnClickListener for every button you can use databinding for that as well. It reduce lots of code.
Upvotes: 0