You can download full source code of this project from Github https://github.com/arunkfedex/SimpleCalculator
We are using ViewModel and LiveData so we need to add those dependencies in build.gradle file.
build.gradle
plugins { id 'com.android.application' id 'kotlin-android' } android { compileSdk 30 defaultConfig { applicationId "com.arun.androidtutsforu.simplecalculator" minSdk 21 targetSdk 30 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = '1.8' } buildFeatures{ dataBinding true } } dependencies { def lifecycle_version = "2.4.0-alpha03" implementation 'androidx.core:core-ktx:1.6.0' implementation 'androidx.appcompat:appcompat:1.3.1' implementation 'com.google.android.material:material:1.4.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.0' implementation 'androidx.legacy:legacy-support-v4:1.0.0' implementation "androidx.lifecycle:lifecycle-viewmodel:$lifecycle_version" implementation "androidx.lifecycle:lifecycle-livedata:$lifecycle_version" implementation "androidx.fragment:fragment-ktx:1.3.6" testImplementation 'junit:junit:4.+' androidTestImplementation 'androidx.test.ext:junit:1.1.3' androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' }Next is our layout file 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"> <fragment android:id="@+id/simpleCalcFragment" android:name="com.arun.androidtutsforu.simplecalculator.calculator.SimpleCalcFragment" android:layout_width="match_parent" android:layout_height="match_parent" /> </androidx.constraintlayout.widget.ConstraintLayout>our activity_main.xml file is just holding our fragment , which contains all the ui elements
fragment_simple_calc.xml
Next is our MainActivity.kt<?xml version="1.0" encoding="utf-8"?> <layout 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"> <data> <variable name="simpleCalcViewModel" type="com.arun.androidtutsforu.simplecalculator.calculator.SimpleCalcViewModel" /> </data> <androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".calculator.SimpleCalcFragment"> <TextView android:id="@+id/number" android:layout_width="0dp" android:layout_height="100dp" android:layout_marginStart="8dp" android:layout_marginTop="8dp" android:layout_marginEnd="8dp" android:text="@{simpleCalcViewModel.number}" android:textAlignment="viewEnd" android:textColor="@color/black" android:textSize="35sp" android:textStyle="bold" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <TextView android:id="@+id/result" android:layout_width="0dp" android:layout_height="100dp" android:layout_marginStart="8dp" android:layout_marginEnd="8dp" android:text="@{simpleCalcViewModel.result}" android:textAlignment="viewEnd" android:textColor="@color/black" android:textSize="45sp" android:textStyle="bold" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/number" /> <Button android:id="@+id/zero" style="@style/Calcbutton" android:onClick="@{()->simpleCalcViewModel.numberClicked(`0`)}" android:text="0" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@+id/dot" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toStartOf="parent" /> <Button android:id="@+id/dot" style="@style/Calcbutton" android:onClick="@{()->simpleCalcViewModel.numberClicked(`.`)}" android:text="." app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@+id/equal" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toEndOf="@+id/zero" /> <Button android:id="@+id/equal" style="@style/Calcbutton" android:onClick="@{()->simpleCalcViewModel.equalToClicked()}" android:text="=" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@+id/plus" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toEndOf="@+id/dot" /> <Button android:id="@+id/plus" style="@style/Calcbutton" android:onClick="@{()->simpleCalcViewModel.operatorClicked(`+`)}" android:text="+" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toEndOf="@+id/equal" /> <Button android:id="@+id/one" style="@style/Calcbutton" android:onClick="@{()->simpleCalcViewModel.numberClicked(`1`)}" android:text="1" app:layout_constraintBottom_toTopOf="@+id/zero" app:layout_constraintEnd_toStartOf="@+id/two" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toStartOf="parent" /> <Button android:id="@+id/two" style="@style/Calcbutton" android:onClick="@{()->simpleCalcViewModel.numberClicked(`2`)}" android:text="2" app:layout_constraintBottom_toTopOf="@+id/dot" app:layout_constraintEnd_toStartOf="@+id/three" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toEndOf="@+id/one" /> <Button android:id="@+id/three" style="@style/Calcbutton" android:onClick="@{()->simpleCalcViewModel.numberClicked(`3`)}" android:text="3" app:layout_constraintBottom_toTopOf="@+id/equal" app:layout_constraintEnd_toStartOf="@+id/minus" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toEndOf="@+id/two" /> <Button android:id="@+id/minus" style="@style/Calcbutton" android:onClick="@{()->simpleCalcViewModel.operatorClicked(`-`)}" android:text="-" app:layout_constraintBottom_toTopOf="@+id/plus" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toEndOf="@+id/three" /> <Button android:id="@+id/four" style="@style/Calcbutton" android:onClick="@{()->simpleCalcViewModel.numberClicked(`4`)}" android:text="4" app:layout_constraintBottom_toTopOf="@+id/one" app:layout_constraintEnd_toStartOf="@+id/five" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toStartOf="parent" /> <Button android:id="@+id/five" style="@style/Calcbutton" android:onClick="@{()->simpleCalcViewModel.numberClicked(`5`)}" android:text="5" app:layout_constraintBottom_toTopOf="@+id/two" app:layout_constraintEnd_toStartOf="@+id/six" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toEndOf="@+id/four" /> <Button android:id="@+id/six" style="@style/Calcbutton" android:onClick="@{()->simpleCalcViewModel.numberClicked(`6`)}" android:text="6" app:layout_constraintBottom_toTopOf="@+id/three" app:layout_constraintEnd_toStartOf="@+id/multiply" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toEndOf="@+id/five" /> <Button android:id="@+id/multiply" style="@style/Calcbutton" android:onClick="@{()->simpleCalcViewModel.operatorClicked(`*`)}" android:text="*" app:layout_constraintBottom_toTopOf="@+id/minus" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toEndOf="@+id/six" /> <Button android:id="@+id/seven" style="@style/Calcbutton" android:onClick="@{()->simpleCalcViewModel.numberClicked(`7`)}" android:text="7" app:layout_constraintBottom_toTopOf="@+id/four" app:layout_constraintEnd_toStartOf="@+id/eight" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toStartOf="parent" /> <Button android:id="@+id/eight" style="@style/Calcbutton" android:onClick="@{()->simpleCalcViewModel.numberClicked(`8`)}" android:text="8" app:layout_constraintBottom_toTopOf="@+id/five" app:layout_constraintEnd_toStartOf="@+id/nine" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toEndOf="@+id/seven" /> <Button android:id="@+id/nine" style="@style/Calcbutton" android:onClick="@{()->simpleCalcViewModel.numberClicked(`9`)}" android:text="9" app:layout_constraintBottom_toTopOf="@+id/six" app:layout_constraintEnd_toStartOf="@+id/divide" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toEndOf="@+id/eight" /> <Button android:id="@+id/divide" style="@style/Calcbutton" android:onClick="@{()->simpleCalcViewModel.operatorClicked(`/`)}" android:text="/" app:layout_constraintBottom_toTopOf="@+id/multiply" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toEndOf="@+id/nine" /> <Button android:id="@+id/clear_all" style="@style/Calcbutton" android:layout_marginTop="8dp" android:onClick="@{()->simpleCalcViewModel.clearAllclicked()}" android:text="Clear" app:layout_constraintBottom_toTopOf="@+id/nine" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/result" /> </androidx.constraintlayout.widget.ConstraintLayout> </layout>
package com.arun.androidtutsforu.simplecalculator import androidx.appcompat.app.AppCompatActivity import android.os.Bundle class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) } }All our ui elements are managed by our fragment
SimpleCalcFragment.kt
package com.arun.androidtutsforu.simplecalculator.calculator import android.os.Bundle import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.activityViewModels import androidx.fragment.app.viewModels import com.arun.androidtutsforu.simplecalculator.R import com.arun.androidtutsforu.simplecalculator.databinding.FragmentSimpleCalcBinding class SimpleCalcFragment : Fragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { val binding = FragmentSimpleCalcBinding.inflate(inflater,container,false) val viewModel :SimpleCalcViewModel by activityViewModels() binding.simpleCalcViewModel =viewModel binding.setLifecycleOwner(this) return binding.root } }In new android architecture fragments should only display data. All the data calculation and decision making should be done in ViewModel
our SimpleCalcViewModel.kt
You can download full source code of this project from github package com.arun.androidtutsforu.simplecalculator.calculator import android.widget.Toast import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import java.math.BigDecimal import java.math.RoundingMode import kotlin.math.floor class SimpleCalcViewModel : ViewModel() { var secondNum = 0.0 var opcode :String ="" var firstNumStr ="" var secondNumStr ="" var firstNum =0.0 var isFirst:Boolean = true private var _number = MutableLiveData<String>() val number:LiveData<String> get() = _number private var _result = MutableLiveData<String>() val result:LiveData<String> get() = _result init{ _number.value="" _result.value="" } fun numberClicked(num:String){ _number.value = _number.value+num if(isFirst) { firstNumStr = firstNumStr + num firstNum =firstNumStr.toDouble() }else{ secondNumStr = secondNumStr + num secondNum = secondNumStr.toDouble() } } fun operatorClicked(operator :String){ _number.value=_number.value+operator opcode=operator isFirst=false } fun equalToClicked(){ when(opcode){ "+"->_result.value=(firstNum+secondNum).toString() "-"->_result.value=(firstNum-secondNum).toString() "*"->_result.value=(firstNum*secondNum).toString() "/"->_result.value=(firstNum/secondNum).toString() else->0 } clear() } fun clearAllclicked(){ clear() _number.value="" _result.value="" } fun clear(){ isFirst=true firstNumStr="" secondNumStr="" firstNum=0.0 secondNum=0.0 } }
Comments
Post a Comment