Hello Developers, welcome to Techpass Master, In this post, you will learn How to build a Tip Calculator app in Android Studio Using Kotlin. We have also created a complete series of this project on Youtube, you can get it in my Youtube channel. In this post, I will share complete source code of the app.
If you are a beginner, so I will suggest you watch all videos of this app series for better understanding, below, I will put all videos of this app series . If you really want to learn, how to build basic calculation-related things that are worked in App, so watch all videos and don’t copy and paste,
Below, I have shared the source code of the tip calculator app using Kotlin step-by-step. So without any further discussion let’s get started!
Tip Calculator App in Android Studio Using Kotlin (Complete Code)
activity_main.xml (UI Design)
<?xml version="1.0" encoding="utf-8"?> <ScrollView 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" android:background="@android:color/black" tools:context=".MainActivity"> <androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="16dp"> <TextView android:id="@+id/tvTitle" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:text="Basic Tip Calculator" android:textColor="@color/white" android:textSize="32sp" android:textStyle="bold" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <EditText android:id="@+id/edtBill" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="20dp" android:gravity="center" android:hint="Enter your bill amount" android:inputType="numberDecimal" android:textColor="@color/white" android:textColorHint="@color/white" android:textSize="22sp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/tvTitle" /> <TextView android:id="@+id/tvTipPercentageTitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="22dp" android:text="How was the service (Tip %)" android:textColor="#DCEDA2" android:textSize="20sp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/edtBill" /> <RadioGroup android:id="@+id/rgTipOptions" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="16dp" android:checkedButton="@id/rbTipTwentyPercent" android:orientation="vertical" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/tvTipPercentageTitle"> <RadioButton android:id="@+id/rbTipTwentyPercent" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Amazing (20%)" android:textSize="16sp" android:textColor="@color/white" /> <RadioButton android:id="@+id/rbTipFifteenPercent" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Good (15%)" android:textSize="16sp" android:textColor="@color/white" /> <RadioButton android:id="@+id/rbTipTanPercent" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Ok (10%)" android:textSize="16sp" android:textColor="@color/white" /> </RadioGroup> <TextView android:id="@+id/tvNumberOfPerson" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="16dp" android:text="Number of Person" android:textAllCaps="false" android:textColor="#DCEDA2" android:textSize="18sp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/rgTipOptions" /> <Button android:id="@+id/btnPersonPlus" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="8dp" android:backgroundTint="#FAFAFA" android:text="+" android:textColor="#E80808" android:textSize="18sp" app:layout_constraintStart_toStartOf="@id/tvNumberOfPerson" app:layout_constraintTop_toBottomOf="@id/tvNumberOfPerson" /> <Button android:id="@+id/btnPersonMinus" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="8dp" android:backgroundTint="#FAFAFA" android:text="-" android:textColor="#E80808" android:textSize="18sp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@id/tvNumberOfPerson" /> <TextView android:id="@+id/tvPersonCount" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="1" android:textColor="@color/white" android:textSize="20sp" app:layout_constraintBottom_toBottomOf="@+id/btnPersonPlus" app:layout_constraintEnd_toStartOf="@+id/btnPersonMinus" app:layout_constraintStart_toEndOf="@+id/btnPersonPlus" app:layout_constraintTop_toTopOf="@+id/btnPersonPlus" /> <Button android:id="@+id/btnCalculateTip" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="16dp" android:backgroundTint="#FAFAFA" android:text="calculate" android:textColor="#E80808" android:textSize="16sp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/btnPersonMinus" /> <TextView android:id="@+id/tvTotalTip" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="16dp" android:textColor="@color/white" android:textStyle="bold" android:textSize="18sp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@id/btnCalculateTip" /> <TextView android:id="@+id/tvTipPerPerson" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="8dp" android:textColor="@color/white" android:textStyle="bold" android:textSize="18sp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@+id/tvTotalBillPlusTip" /> <TextView android:id="@+id/tvTotalBillPlusTip" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="8dp" android:textColor="@color/white" android:textStyle="bold" android:textSize="18sp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@+id/tvTotalTip" /> <TextView android:id="@+id/tvTotalPerPerson" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="8dp" android:textColor="@color/white" android:textStyle="bold" android:textSize="18sp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@+id/tvTipPerPerson" /> <ImageView android:id="@+id/imgCopyTip" android:layout_width="32dp" android:layout_height="32dp" android:layout_marginTop="24dp" android:layout_marginEnd="16dp" android:layout_marginRight="16dp" android:src="@drawable/ic_copy" android:visibility="gone" app:layout_constraintEnd_toStartOf="@+id/guideline" app:layout_constraintTop_toBottomOf="@+id/tvTotalPerPerson" tools:ignore="ContentDescription" /> <ImageView android:id="@+id/imgShareTip" android:layout_width="32dp" android:layout_height="32dp" android:layout_marginStart="16dp" android:layout_marginLeft="16dp" android:layout_marginTop="24dp" android:src="@drawable/ic_share" android:visibility="gone" app:layout_constraintStart_toStartOf="@+id/guideline" app:layout_constraintTop_toBottomOf="@+id/tvTotalPerPerson" tools:ignore="ContentDescription" /> <androidx.constraintlayout.widget.Guideline android:id="@+id/guideline" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" app:layout_constraintGuide_percent="0.5" /> </androidx.constraintlayout.widget.ConstraintLayout> </ScrollView>
MainActivity.kt (Main Logic)
package com.taiyabali.basictipcalculator import android.content.ClipData import android.content.ClipboardManager import android.content.Intent import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.view.View import android.widget.Toast import com.taiyabali.basictipcalculator.databinding.ActivityMainBinding import java.text.NumberFormat import java.util.* /** * Created by Techpass Master. * Website - https://techpassmaster.com/ * Email id - hello@techpassmaster.com */ class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding private var countPerson = 1 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) binding.edtBill.requestFocus() onViewClick() } private fun onViewClick() { with(binding) { btnCalculateTip.setOnClickListener { calculateTip() } btnPersonPlus.setOnClickListener { countPerson++ tvPersonCount.text = countPerson.toString() } btnPersonMinus.setOnClickListener { if (countPerson > 1) { countPerson-- tvPersonCount.text = countPerson.toString() } } imgCopyTip.setOnClickListener { val tipFormatted = "${tvTotalTip.text}\n" + "${tvTotalBillPlusTip.text}\n" + "${tvTipPerPerson.text}\n" + "${tvTotalPerPerson.text}" copyTipResult(tipFormatted) } imgShareTip.setOnClickListener { val tipFormatted = "${tvTotalTip.text}\n" + "${tvTotalBillPlusTip.text}\n" + "${tvTipPerPerson.text}\n" + "${tvTotalPerPerson.text}" shareTipResult(tipFormatted) } } } private fun calculateTip() { // get bill cost from EditText. // set total bill amount in the cost. val totalBill: String = binding.edtBill.text.toString() val cost = totalBill.toDoubleOrNull() if (totalBill.isNotEmpty()) { binding.imgCopyTip.visibility = View.VISIBLE binding.imgShareTip.visibility = View.VISIBLE // get selected tip percentage val tipPercentage = when (binding.rgTipOptions.checkedRadioButtonId) { R.id.rbTipTwentyPercent -> 0.20 R.id.rbTipFifteenPercent -> 0.15 else -> 0.10 } // Calculate the tip according to percentage and set per person tip val tip = tipPercentage * cost!! showTotalTipResult(tip) // Calculate & set the per person tip val perPersonTip = (tip / countPerson).toString() showPerPersonTipResult(perPersonTip.toDouble()) // Calculate & set total bill + tip val billPlusTip = cost.plus(tip) showTotalBillPlusTipResult(billPlusTip) // Calculate & set per person total val totalPerPerson = (billPlusTip / countPerson).toString() showTotalPerPersonResult(totalPerPerson.toDouble()) } else { Toast.makeText(this, "Please enter bill Amount", Toast.LENGTH_SHORT).show() } } private fun showTotalTipResult(tip: Double) { val numberFormat = NumberFormat.getCurrencyInstance(Locale("en", "in")).format(tip) binding.tvTotalTip.text = ("Total Tip: $numberFormat") } private fun showTotalBillPlusTipResult(tip: Double) { val numberFormat = NumberFormat.getCurrencyInstance(Locale("en", "in")).format(tip) binding.tvTotalBillPlusTip.text = ("Total Amount (Bill+Tip): $numberFormat") } private fun showPerPersonTipResult(tip: Double) { val numberFormat = NumberFormat.getCurrencyInstance(Locale("en", "in")).format(tip) binding.tvTipPerPerson.text = ("Per Person Tip: $numberFormat") if (countPerson == 1) { binding.tvTipPerPerson.text = ("Tip: $numberFormat") } else { binding.tvTipPerPerson.text = ("Per Person Tip: $numberFormat") } } private fun showTotalPerPersonResult(tip: Double) { val numberFormat = NumberFormat.getCurrencyInstance(Locale("en", "in")).format(tip) if (countPerson == 1) { binding.tvTotalPerPerson.text = ("Total: $numberFormat") } else { binding.tvTotalPerPerson.text = ("Total Per Person: $numberFormat") } } private fun copyTipResult(copyTipResultText : String){ val clipboardManager = getSystemService(CLIPBOARD_SERVICE) as ClipboardManager val clipData = ClipData.newPlainText("text", copyTipResultText) clipboardManager.setPrimaryClip(clipData) Toast.makeText(this, "Tip copied", Toast.LENGTH_LONG).show() } private fun shareTipResult(shareTipResultText :String){ val sendIntent: Intent = Intent().apply { action = Intent.ACTION_SEND putExtra(Intent.EXTRA_TEXT,shareTipResultText ) type = "text/plain" } val shareIntent = Intent.createChooser(sendIntent, null) startActivity(shareIntent) } }
Congratulations, all steps are done, now let’s run and test the application.
You May Also Like ⇣
- Kotlin tutorial for beginners.
- How To Make An Android App For Beginners
- Android Interview Questions For Fresher.
- Install & Setup Android Studio Java JDK & SDK.
- Load Image from URL with Shimmer Effect in Jetpack Compose
- Top 5 Things To Avoid While Developing Android Apps.
- 5 Best GitHub Repositories For Android Developer.
- 15 Best Useful Sites For Online Learning.