i been working on an calcaultor app i managed to finish all the buttons but the backspace button ain't working, everytime i try it basically it deletes the numbers from the textView and it doesn't save it true value for example if i hit 9 button 3 times which would give me "999" as a result and then i hit the backspace button it should be "99" and that what actually happens it applies to the textView only so if i try multiplying "99" to "1" after using my backspace which was "999" the result that actually was given is "999" which is wrong cuz "99" * "1" = "99"
My here is part of my mainActivity's code:
package com.example.newcal
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.text.TextUtils.substring
import android.view.View
import android.widget.Button
import android.widget.TextView
import java.lang.IllegalArgumentException
import java.util.*
import kotlin.collections.ArrayList
import kotlin.math.absoluteValue
class MainActivity : AppCompatActivity() {
private var strNumber = StringBuilder()
private lateinit var tvDisplay: TextView
private lateinit var button1: Button
private lateinit var button2: Button
private lateinit var button3: Button
private lateinit var button4: Button
private lateinit var button5: Button
private lateinit var button6: Button
private lateinit var button7: Button
private lateinit var button8: Button
private lateinit var button9: Button
private lateinit var buttonClear: Button
private lateinit var buttonDot: Button
private lateinit var buttonZero: Button
private lateinit var buttonDivide: Button
private lateinit var buttonMultiply: Button
private lateinit var buttonSubtract: Button
private lateinit var buttonAdd: Button
private lateinit var buttonEquals: Button
private lateinit var buttonBack: Button
private lateinit var operatorButtons: List<Button>
private lateinit var numbButtons: Array<Button>
private var operator: Operator = Operator.NONE
private var isOperatorClicked: Boolean = false
private var no1: Double = 0.0
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
components()
strNumber.append(0.0)
tvDisplay.text = strNumber
isOperatorClicked = true
for (i in operatorButtons){i.setOnClickListener { operatorButtonClicked(i) }}
for (i in numbButtons){i.setOnClickListener { numbButtonsClicked(i) }}
buttonEquals.setOnClickListener { buttonEqualsClicked() }
buttonClear.setOnClickListener { btnClickedClear() }
buttonBack.setOnClickListener { btnClickedBack() }
}
private fun buttonEqualsClicked() {
val no2 = strNumber.toString().toDouble()
val result: Double
if (isOperatorClicked == false){
when(operator){
Operator.ADD -> result = no1 + no2
Operator.SUB -> result = no1 - no2
Operator.DIV -> result = no1 / no2
Operator.MUL -> result = no1 * no2
Operator.NONE -> result = 0.0
}
strNumber.clear()
strNumber.append(result.toString())
tvDisplay.text = strNumber
isOperatorClicked = true
}
}
private fun btnClickedBack() {
var str = tvDisplay.text.toString()
if (str.length > 1) {
str = str.substring(0, str.length - 1)
tvDisplay.text = str
}
if (str.length <= 1){
val st = strNumber.append(btnClickedClear().substring(0, strNumber.length -3))
tvDisplay.text = st
}
}
enum class Operator{ADD, SUB, DIV, MUL, NONE}
and here is some screenshots for a better view
In my opinion, you have not to use StringBuilder. Instead, you can use String variable you will modify directly.
If you're sure that you will stay use StringBuilder, you must remove last char in StringBuilder as below.
private fun btnClickedBack() {
if(strNumber.length() > 0){
strNumber.deleteCharAt(sb.length() - 1)
tvDisplay.text = strNumber
}
}