android 简易计算器app kotlin版

  学习了一下kotlin的基础语法,想了想正好重写一下之前的计算器来熟练一下用法。

  android 简易计算器app kotlin版 - Chi4ki - 博客园 (cnblogs.com)

  因为参考的教程时间有点早,这里获取控件用的是'kotlin-android-extensions'给的功能(现在用这个会被警告,原因是这个虽然方便但牺牲了一些性能且存在隐患,所以已经被废弃了,现在用来替代的是ViewBinding),之后有时间应该会再研究一下ViewBinding怎么用。

  当然这里我用的就是'kotlin-android-extensions'了,在build.gradle里加上id 'kotlin-android-extensions':

plugins {
    id 'com.android.application'
    id 'org.jetbrains.kotlin.android'
    id 'kotlin-android-extensions'
}

  计算器的逻辑和之前写的相同:记一次java简易计算器的实现(windows&android) - Chi4ki - 博客园 (cnblogs.com),之后有机会考虑再优化一下(不得不说when用起来是真的舒服)。

  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">

    <GridLayout
        android:id="@+id/GridLayout1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:columnCount="4"
        android:orientation="horizontal"
        android:rowCount="6"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <TextView
            android:layout_height="78dp"
            android:layout_columnSpan="4"
            android:layout_gravity="fill"
            android:layout_marginLeft="5dp"
            android:layout_marginRight="5dp"
            android:background="#FFCCCC"
            android:text="0"
            android:id="@+id/txv"
            android:textSize="50sp" />


        <Button
            android:layout_columnSpan="2"
            android:layout_gravity="fill"
            android:id="@+id/DEL"
            android:text="DEL" />

        <Button
            android:layout_columnSpan="2"
            android:layout_gravity="fill"
            android:id="@+id/AC"
            android:text="AC" />

        <Button
            android:text="+"
            android:id="@+id/plus"
            />

        <Button android:text="1"
            android:id="@+id/one"/>

        <Button android:text="2"
            android:id="@+id/two"/>

        <Button android:text="3"
            android:id="@+id/three"/>

        <Button android:text="-"
            android:id="@+id/minus"/>

        <Button android:text="4"
            android:id="@+id/four"/>

        <Button android:text="5"
            android:id="@+id/five"/>

        <Button android:text="6"
            android:id="@+id/six"/>

        <Button android:text="*"
            android:id="@+id/multiply"/>

        <Button android:text="7"
            android:id="@+id/seven"/>

        <Button android:text="8"
            android:id="@+id/eight"/>

        <Button android:text="9"
            android:id="@+id/nine" />

        <Button
            android:layout_width="wrap_content"
            android:text="/"
            android:id="@+id/divide"/>

        <Button
            android:layout_width="wrap_content"
            android:text="."
            android:id="@+id/point"/>

        <Button android:text="0"
            android:id="@+id/zero"/>

        <Button android:text="="
            android:id="@+id/equals"/>

    </GridLayout>

</androidx.constraintlayout.widget.ConstraintLayout>

  MainActivity.kt

package com.example.cal_kotlin

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import android.widget.Button
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity(), View.OnClickListener {
    var n1:Double=0.0
    var n2:Double=0.0
    var str:String=""
    var j:Int=0
    var symbol:Int=0
    var equal:Int=0
    var poi:Int=1
    var sum:Double=0.0
    var n3:Double=0.0

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        one.setOnClickListener(this)
        two.setOnClickListener(this)
        three.setOnClickListener(this)
        four.setOnClickListener(this)
        five.setOnClickListener(this)
        six.setOnClickListener(this)
        seven.setOnClickListener(this)
        eight.setOnClickListener(this)
        nine.setOnClickListener(this)
        zero.setOnClickListener(this)
        point.setOnClickListener(this)
        plus.setOnClickListener(this)
        minus.setOnClickListener(this)
        multiply.setOnClickListener(this)
        divide.setOnClickListener(this)
        equals.setOnClickListener(this)
        DEL.setOnClickListener(this)
        AC.setOnClickListener(this)
    }
    override fun onClick(v: View?) {
        doClick("" + (v as Button).text)
    }

    private fun  doClick(va:String){
        var value:String=va
        //字符串长度为0时,如果输入加减乘除删除等于,都会转为AC避免闪退
        if(str.length==0){
            when(value){
                "+","-","*","/","DEL","="->{
                    value="AC"
                }
            }
        }
        //如果字符串只有小数点,那么加减乘除等于都转换为AC(同样是避免bug)
        if(".".equals(str)){
            when(value){
                "+","-","*","/","="->{
                    value="AC"
                }
            }
        }
        //如果输入了两个符号且之间都有数字,那么这里会计算前面两个数字的结果并设置为str
        if(j==0&&symbol!=0){
            when(value){
                "+"->{
                    n3=str.toDouble()
                    sum=n1+n3
                    if(poi==1){
                        str=sum.toInt().toString()
                    }
                    else{str=sum.toString()}
                }
                "-"->{
                    n3=str.toDouble()
                    sum=n1-n3
                    if(poi==1){
                        str=sum.toInt().toString()
                    }
                    else{str=sum.toString()}
                }
                "*"->{
                    n3=str.toDouble()
                    sum=n1*n3
                    if(poi==1){
                        str=sum.toInt().toString()
                    }
                    else{str=sum.toString()}
                }
                "/"->{
                    n3=str.toDouble()
                    if(n3==0.0){
                        value="AC"
                    }
                    else {
                        sum = n1 / n3
                    }
                    str=sum.toString()
                }
            }
        }
        //如果存在小数点,则poi修改为0
        if(str.contains(".")){
            poi=0
        }
        //前面的各种清况考虑完,现在可以进行正常情况下的处理了
        when(value){
            "0","1","2","3","4","5","6","7","8","9"->{
                if(equal==1){
                    str=""
                    poi=1
                    equal=0
                }
                str+=value
                txv.setText(str)
                if(j!=0){
                    symbol=j
                    j=0
                }
            }
            "."->{
                if(!str.contains(".")){
                    str+=value
                    txv.setText(str)
                }
            }
            "+"->{
                equal=0
                if(j==0){
                    j=1
                    n1=str.toDouble()
                    str=""
                    txv.setText(value)
                }else{
                    j=1
                    txv.setText(value)
                }
            }
            "-"->{
                equal=0
                if(j==0){
                    j=2
                    n1=str.toDouble()
                    str=""
                    txv.setText(value)
                }else{
                    j=2
                    txv.setText(value)
                }
            }
            "*"->{
                equal=0
                if(j==0){
                    j=3
                    n1=str.toDouble()
                    str=""
                    txv.setText(value)
                }else{
                    j=3
                    txv.setText(value)
                }
            }
            "/"->{
                equal=0
                if(j==0){
                    j=4
                    n1=str.toDouble()
                    str=""
                    txv.setText(value)
                }else{
                    j=4
                    txv.setText(value)
                }
            }
            "="->{
                n2=str.toDouble()
                when(symbol){
                    0->{
                        sum=n2
                        if(poi==1){str=sum.toInt().toString()}
                        else{str=sum.toString()}
                        txv.setText(str)
                    }
                    1->{
                        sum=n1+n2
                        if(poi==1){str=sum.toInt().toString()}
                        else{str=sum.toString()}
                        txv.setText(str)
                    }
                    2->{
                        sum=n1-n2
                        if(poi==1){str=sum.toInt().toString()}
                        else{str=sum.toString()}
                        txv.setText(str)
                    }
                    3->{
                        sum=n1*n2
                        if(poi==1){str=sum.toInt().toString()}
                        else{str=sum.toString()}
                        txv.setText(str)
                    }
                    4->{
                        if(n2==0.0){
                            str="0"
                        }
                        else{
                            sum=n1/n2
                            str=sum.toString()
                        }
                        txv.setText(str)
                    }
                }
                j = 0
                symbol = 0
                n1 = 0.0
                n2 = 0.0
                sum = 0.0
                equal=1
            }
            "AC"->{
                str=""
                j = 0
                symbol = 0
                sum = 0.0
                n1 = 0.0
                n2 = 0.0
                equal = 0
                poi=1
                txv.setText("0")
            }
            "DEL"->{
                if(j!=0){
                    j=0
                    str=n1.toString()
                    txv.setText(str)
                }else{
                    str = str.substring(0, str.length - 1)
                    txv.setText(str)
                }
            }
        }
        //考虑删除小数点的情况
        if((n1-n1.toInt()==0.0)&&!(str.contains("."))){
            poi=1
        }
    }
}

  (插入代码里没有kotlin的排版……)

  

posted @ 2022-04-07 18:39  Chi4ki  阅读(435)  评论(0)    收藏  举报