【问题标题】:Why does my simple calculator crashes when i don't give the second operand and press equal?为什么当我不给第二个操作数并按相等时,我的简单计算器会崩溃?
【发布时间】:2021-07-11 21:57:02
【问题描述】:

我是安卓开发新手。我试图使用 Kotlin 实现一个简单的计算器。所有功能都按预期工作,除了当我只输入我的第一个操作数和运算符但没有给出我的第二个操作数并按相等而不是它崩溃时。

显然我得到的错误是它试图执行“inputValue = binding.tvInput.text.toString()”但失败了,因为它们在 tvInput 中没有价值。

我想我已经在 onEquals 函数中写了一个 if 语句来处理这个问题,但是它不起作用。

这是供您参考的代码:

请帮忙!

XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">


    <TextView
        android:id="@+id/tvResult"
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:background="#efefef"
        android:maxLength="12"
        tools:text="Result"
        android:textSize="48sp" />
    <TextView
        android:id="@+id/tvOperator"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#efefef"
        android:maxLength="1"
        tools:text="Operator"
        android:textSize="48sp" />
    <TextView
        android:id="@+id/tvInput"
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:background="#efefef"
        android:maxLength="12"
        tools:text="Input"
        android:textSize="48sp" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="0dp"
        android:layout_weight="1"
        android:orientation="horizontal"
        android:padding="0dp">

        <android.widget.Button
            android:id="@+id/btn7"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_marginStart="2dp"
            android:layout_marginEnd="2dp"
            android:layout_weight="1"
            android:onClick="onDigit"
            android:text="7" />

        <android.widget.Button
            android:id="@+id/btn8"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_marginStart="2dp"
            android:layout_marginEnd="2dp"
            android:layout_weight="1"
            android:onClick="onDigit"
            android:text="8" />

        <android.widget.Button
            android:id="@+id/btn9"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_marginStart="2dp"
            android:layout_marginEnd="2dp"
            android:layout_weight="1"
            android:onClick="onDigit"
            android:text="9" />

        <android.widget.Button
            android:id="@+id/btnDivide"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_marginStart="2dp"
            android:layout_marginEnd="2dp"
            android:layout_weight="1"
            android:onClick="onOperator"
            android:text="/" />

    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="0dp"
        android:layout_weight="1"
        android:orientation="horizontal"
        android:padding="0dp">

        <android.widget.Button
            android:id="@+id/btn4"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_marginStart="2dp"
            android:layout_marginEnd="2dp"
            android:layout_weight="1"
            android:onClick="onDigit"
            android:text="4" />

        <android.widget.Button
            android:id="@+id/btn5"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_marginStart="2dp"
            android:layout_marginEnd="2dp"
            android:layout_weight="1"
            android:onClick="onDigit"
            android:text="5" />

        <android.widget.Button
            android:id="@+id/btn6"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_marginStart="2dp"
            android:layout_marginEnd="2dp"
            android:layout_weight="1"
            android:onClick="onDigit"
            android:text="6" />

        <android.widget.Button
            android:id="@+id/btnMultiply"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_marginStart="2dp"
            android:layout_marginEnd="2dp"
            android:layout_weight="1"
            android:onClick="onOperator"
            android:text="*" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="0dp"
        android:layout_weight="1"
        android:orientation="horizontal"
        android:padding="0dp">

        <android.widget.Button
            android:id="@+id/btn1"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_marginStart="2dp"
            android:layout_marginEnd="2dp"
            android:layout_weight="1"
            android:onClick="onDigit"
            android:text="1" />

        <android.widget.Button
            android:id="@+id/btn2"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_marginStart="2dp"
            android:layout_marginEnd="2dp"
            android:layout_weight="1"
            android:onClick="onDigit"
            android:text="2" />

        <android.widget.Button
            android:id="@+id/btn3"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_marginStart="2dp"
            android:layout_marginEnd="2dp"
            android:layout_weight="1"
            android:onClick="onDigit"
            android:text="3" />

        <android.widget.Button
            android:id="@+id/btnMinus"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_marginStart="2dp"
            android:layout_marginEnd="2dp"
            android:layout_weight="1"
            android:onClick="onOperator"
            android:text="-" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="0dp"
        android:layout_weight="1"
        android:orientation="horizontal"
        android:padding="0dp">

        <android.widget.Button
            android:id="@+id/btnDot"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_marginStart="2dp"
            android:layout_marginEnd="2dp"
            android:layout_weight="1"
            android:onClick="onDecimalPoint"
            android:text="." />

        <android.widget.Button
            android:id="@+id/btn0"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_marginStart="2dp"
            android:layout_marginEnd="2dp"
            android:layout_weight="1"
            android:onClick="onDigit"
            android:text="0" />

        <android.widget.Button
            android:id="@+id/btnClr"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_marginStart="2dp"
            android:layout_marginEnd="2dp"
            android:layout_weight="1"
            android:onClick="onClear"
            android:text="clr" />

        <android.widget.Button
            android:id="@+id/btnPlus"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_marginStart="2dp"
            android:layout_marginEnd="2dp"
            android:layout_weight="1"
            android:onClick="onOperator"
            android:text="+" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="0dp"
        android:layout_weight="1"
        android:orientation="horizontal"
        android:padding="0dp">

        <android.widget.Button
            android:id="@+id/btnDel"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_marginStart="2dp"
            android:layout_marginEnd="2dp"
            android:layout_weight="1"
            android:onClick="onEquals"
            android:text="=" />
        <android.widget.Button
            android:id="@+id/btnEquals"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_marginStart="2dp"
            android:layout_marginEnd="2dp"
            android:layout_weight="1"
            android:onClick="onDelete"
            android:text="DEL" />

    </LinearLayout>


</LinearLayout>

MainActivity.kt

package com.jeetkabiraj.calculatorapp

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.view.View
import android.widget.Button
import com.jeetkabiraj.calculatorapp.databinding.ActivityMainBinding
import com.jeetkabiraj.calculatorapp.databinding.ActivityMainBinding.inflate
import java.lang.ArithmeticException


class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding
    var lastNumaric = false
    var lastDot = false
    var inputValue: String = ""
    var result: String = ""
    var operator: String = ""
    var finalResult: Double = 0.0
    var TAG = "Message"

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        viewBinding()
    }

    private fun viewBinding() {
        binding = inflate(layoutInflater)
        setContentView(binding.root)
    }

    fun onDigit(view: View){
        binding.tvInput.append((view as Button).text)
        lastNumaric = true
    }

    fun onClear(view: View) {
        binding.tvInput.text = ""
        lastNumaric = false
        lastDot = false
    }

    fun onDecimalPoint(view: View){
        if(lastNumaric && !lastDot){
            binding.tvInput.append(".")
            lastDot = true
            lastNumaric = false
        }
    }

    fun onOperator(view: View){



        operator = (view as Button).text.toString()

            if(result == ""){
                result = binding.tvInput.text.toString()
                binding.tvResult.text = result
                binding.tvOperator.text = operator
                binding.tvInput.text = ""
        }
        else{
                binding.tvOperator.text = operator
                binding.tvInput.text = ""
            }
    }

    fun onEquals(view: View){


        if((binding.tvOperator.text != "") && (binding.tvResult.text != "") && (binding.tvInput.text != "")){

            result = binding.tvResult.text.toString()
            inputValue = binding.tvInput.text.toString()
            operator = binding.tvOperator.text.toString()

            var op1: Double = result.toDouble()
            Log.e(TAG, "inputValue is? " +binding.tvInput.text)
            var op2: Double = inputValue.toDouble()

            when(operator){
                "+" -> finalResult = op1 + op2
                "-" -> finalResult = op1 - op2
                "*" -> finalResult = op1 * op2
                "/" -> {
                    try {
                        finalResult = op1 / op2
                    } catch (e: ArithmeticException){
                        e.printStackTrace()
                    }
                }
            }
            binding.tvResult.text = finalResult.toString()
            binding.tvInput.text = ""
            binding.tvOperator.text = ""

        } else{
            binding.tvInput.text = "Error"
        }

    }

    fun onDelete(view: View){
        binding.tvInput.text = ""
        binding.tvResult.text = ""
        binding.tvOperator.text = ""
        result = ""
        inputValue = ""
        operator= ""
        finalResult = 0.0
        lastDot = false
        lastNumaric = false
    }

}

【问题讨论】:

  • 也添加异常
  • 我应该在哪里添加它以及什么异常,我是新人请详细说明
  • 问题是关于你得到的错误。您能否提供更多有关它的信息,最好是堆栈跟踪?
  • 试试这个github.com/bitactro/Basic_Calculator_Android_App。它在 java 中,但工作得很好
  • 引起:java.lang.NumberFormatException:空字符串在 sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1842) 在 sun.misc.FloatingDecimal.parseDouble(FloatingDecimal.java:110) 在java.lang.Double.parseDouble(Double.java:538) at com.jeetkabiraj.calculatorapp.MainActivity.onEquals(MainActivity.kt:83)

标签: android android-studio kotlin


【解决方案1】:
if((binding.tvOperator.text != "") && (binding.tvResult.text != "") && (binding.tvInput.text != ""))

      

我认为问题出在这一行。而不是 text != "" 你应该写 text.toString().equals("")

if(!(binding.tvOperator.text.toString().equals("")) && !(binding.tvResult.text.toString().equals("")) && !(binding.tvInput.text.toString().equals("")))

【讨论】:

  • 在 Kotlin 中也是如此。
  • 不,不是。 getText() 或者在这种情况下,文本将返回 CharSequence!我们希望将值存储在文本中
  • 我说的主要是用equals() 替换!=,但你说得对,如果textCharSequence,那么我们需要将其转换为字符串。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-29
相关资源
最近更新 更多