setOnClickListener не работает для кнопки в Android Kotlin - PullRequest
0 голосов
/ 08 апреля 2020

Я пытаюсь создать простое приложение калькулятора для android, используя kotlin. Но setOnClickListener не работает при нажатии кнопок.

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>

Ответы [ 3 ]

1 голос
/ 08 апреля 2020

Это потому, что вы не настраиваете слушателя для кнопок, но вы определяете новых слушателей, которые не вызывают какой-либо метод

Это будет работать:

button.setOnClickListener(listener)

Это тоже будет работать, но здесь у вас есть 2 слушателя: исходный, вызванный другим:

button.setOnClickListener{ listener.onClick(it) }
1 голос
/ 08 апреля 2020

Если вы действительно не хотите внедрять View.OnClickListener, вам просто нужно активировать локальный listener при нажатии кнопки. например, для button0 сделать это

button0.setOnClickListener { listener.onClick(it) }

Привязка данных может уменьшить количество строк findViewById. Моя последняя среда обеспечивает привязку данных для kotlin по умолчанию.

0 голосов
/ 08 апреля 2020

Прежде всего, вам не нужно использовать findViewById в Kotlin. Вы можете использовать его напрямую, используя идентификатор, который вы указали в xml.

  1. Используйте прослушиватель щелчков, как показано ниже
button6.setOnClickListener(object :View.OnClickListener{
        // do button click
    })
Для нескольких нажатий кнопок вы можете реализовать View.OnClickListener в действии и использовать его следующим образом.
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
            } 
        }
    }

}

Если вы не хотите устанавливать setOnClickListener для каждой кнопки Вы также можете использовать привязку данных для этого. Это уменьшает много кода.

...