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.
If you have any questions regarding this post. Feel free to comment and share the post with other developers.
Happy Learning 🙂
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.
