Ajanyan Pradeep
Ajanyan Pradeep

Reputation: 1132

setOnClickListener not working for button in Android Kotlin

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

Answers (3)

Sabet Chowdhury
Sabet Chowdhury

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

Giuseppe Giacoppo
Giuseppe Giacoppo

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

Shweta Chauhan
Shweta Chauhan

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.

  1. Use click listener like below
button6.setOnClickListener(object :View.OnClickListener{
        // do button click
    })
  1. 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

Related Questions