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的排版……)

学习了一下kotlin的基础语法,想了想正好重写一下之前的计算器来熟练一下用法。
浙公网安备 33010602011771号