Mobile Application Development (202046712) 12202080501067
Practical – 4
Aim : Develop a standard calculator android application to perform basic
calculations like addition, subtraction, multiplication, and division.
Code:
activity_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
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="@drawable/gradient_background"
tools:context=".MainActivity">
<!-- Result Display at Top -->
<LinearLayout
android:id="@+id/display_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="16dp"
android:orientation="vertical"
android:padding="16dp"
android:background="@drawable/display_background">
<TextView
android:id="@+id/previous_calculation"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="#80FFFFFF"
android:textSize="18sp"
android:gravity="end"
android:maxLines="1"/>
<TextView
android:id="@+id/display"
GCET 15
Mobile Application Development (202046712) 12202080501067
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="0"
android:textColor="#FFFFFF"
android:textSize="36sp"
android:gravity="end"
android:maxLines="1"/>
</LinearLayout>
<!-- Calculator Buttons at Bottom -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginBottom="16dp"
android:orientation="vertical">
<GridLayout
android:id="@+id/gridLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="16dp"
android:columnCount="4"
android:rowCount="5">
<!-- Row 1 -->
<Button
android:id="@+id/btn_clear"
style="@style/CalculatorButton.Operator"
android:text="C" />
<Button
android:id="@+id/btn_plus_minus"
style="@style/CalculatorButton.Operator"
android:text="±" />
<Button
android:id="@+id/btn_percent"
GCET 16
Mobile Application Development (202046712) 12202080501067
style="@style/CalculatorButton.Operator"
android:text="%" />
<Button
android:id="@+id/btn_divide"
style="@style/CalculatorButton.Operator"
android:text="÷" />
<!-- Row 2 -->
<Button
android:id="@+id/btn_7"
style="@style/CalculatorButton.Number"
android:text="7" />
<Button
android:id="@+id/btn_8"
style="@style/CalculatorButton.Number"
android:text="8" />
<Button
android:id="@+id/btn_9"
style="@style/CalculatorButton.Number"
android:text="9" />
<Button
android:id="@+id/btn_multiply"
style="@style/CalculatorButton.Operator"
android:text="×" />
<!-- Row 3 -->
<Button
android:id="@+id/btn_4"
style="@style/CalculatorButton.Number"
android:text="4" />
<Button
android:id="@+id/btn_5"
style="@style/CalculatorButton.Number"
GCET 17
Mobile Application Development (202046712) 12202080501067
android:text="5" />
<Button
android:id="@+id/btn_6"
style="@style/CalculatorButton.Number"
android:text="6" />
<Button
android:id="@+id/btn_subtract"
style="@style/CalculatorButton.Operator"
android:text="-" />
<!-- Row 4 -->
<Button
android:id="@+id/btn_1"
style="@style/CalculatorButton.Number"
android:text="1" />
<Button
android:id="@+id/btn_2"
style="@style/CalculatorButton.Number"
android:text="2" />
<Button
android:id="@+id/btn_3"
style="@style/CalculatorButton.Number"
android:text="3" />
<Button
android:id="@+id/btn_add"
style="@style/CalculatorButton.Operator"
android:text="+" />
<!-- Row 5 -->
<Button
android:id="@+id/btn_0"
style="@style/CalculatorButton.Number"
android:layout_columnSpan="2"
GCET 18
Mobile Application Development (202046712) 12202080501067
android:text="0" />
<Button
android:id="@+id/btn_decimal"
style="@style/CalculatorButton.Number"
android:text="." />
<Button
android:id="@+id/btn_equals"
style="@style/CalculatorButton.Equals"
android:text="=" />
</GridLayout>
</LinearLayout>
</RelativeLayout>
MainActivity.java:
package com.example.calculator;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
private TextView display, previousCalculation;
private String currentNumber = "";
private String previousNumber = "";
private String operation = "";
private boolean isNewOperation = true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
GCET 19
Mobile Application Development (202046712) 12202080501067
setContentView(R.layout.activity_main);
display = findViewById(R.id.display);
previousCalculation = findViewById(R.id.previous_calculation);
// Number buttons
int[] numberButtonIds = {
R.id.btn_0, R.id.btn_1, R.id.btn_2, R.id.btn_3, R.id.btn_4,
R.id.btn_5, R.id.btn_6, R.id.btn_7, R.id.btn_8, R.id.btn_9
};
for (int id : numberButtonIds) {
findViewById(id).setOnClickListener(this::onNumberClick);
}
// Operation buttons
int[] operationButtonIds = {
R.id.btn_add, R.id.btn_subtract, R.id.btn_multiply, R.id.btn_divide
};
for (int id : operationButtonIds) {
findViewById(id).setOnClickListener(this::onOperationClick);
}
// Other buttons
findViewById(R.id.btn_equals).setOnClickListener(this::onEqualsClick);
findViewById(R.id.btn_clear).setOnClickListener(this::onClearClick);
findViewById(R.id.btn_decimal).setOnClickListener(this::onDecimalClick);
findViewById(R.id.btn_plus_minus).setOnClickListener(this::onPlusMinusCl
ick);
findViewById(R.id.btn_percent).setOnClickListener(this::onPercentClick);
}
private void onNumberClick(View view) {
GCET 20
Mobile Application Development (202046712) 12202080501067
Button button = (Button) view;
String number = button.getText().toString();
if (isNewOperation) {
currentNumber = number;
isNewOperation = false;
} else {
if (currentNumber.equals("0")) {
currentNumber = number;
} else {
currentNumber += number;
}
}
updateDisplay();
}
private void onOperationClick(View view) {
Button button = (Button) view;
String newOperation = button.getText().toString();
if (!currentNumber.isEmpty()) {
if (!previousNumber.isEmpty() && !operation.isEmpty() &&
!isNewOperation) {
calculateResult();
}
operation = newOperation;
previousNumber = currentNumber;
currentNumber = "";
updatePreviousCalculationDisplay();
} else if (!previousNumber.isEmpty()) {
operation = newOperation;
}
isNewOperation = false;
}
GCET 21
Mobile Application Development (202046712) 12202080501067
private void onEqualsClick(View view) {
if (!previousNumber.isEmpty() && !currentNumber.isEmpty() &&
!operation.isEmpty()) {
calculateResult();
operation = "";
isNewOperation = true;
}
}
private void onClearClick(View view) {
currentNumber = "";
previousNumber = "";
operation = "";
isNewOperation = true;
display.setText("0");
previousCalculation.setText("");
}
private void onDecimalClick(View view) {
if (isNewOperation) {
currentNumber = "0.";
isNewOperation = false;
} else if (!currentNumber.contains(".")) {
currentNumber += ".";
}
updateDisplay();
}
private void onPlusMinusClick(View view) {
if (currentNumber.isEmpty() && !previousNumber.isEmpty()) {
currentNumber = previousNumber;
previousNumber = "";
}
if (!currentNumber.isEmpty() && !currentNumber.equals("0")) {
if (currentNumber.startsWith("-")) {
currentNumber = currentNumber.substring(1);
GCET 22
Mobile Application Development (202046712) 12202080501067
} else {
currentNumber = "-" + currentNumber;
}
updateDisplay();
}
}
private void onPercentClick(View view) {
if (!currentNumber.isEmpty()) {
double num = Double.parseDouble(currentNumber) / 100;
currentNumber = String.valueOf(num);
// Remove trailing .0 if it's an integer
if (currentNumber.endsWith(".0")) {
currentNumber = currentNumber.substring(0,
currentNumber.length() - 2);
}
updateDisplay();
}
}
private void calculateResult() {
if (previousNumber.isEmpty() || currentNumber.isEmpty() ||
operation.isEmpty()) {
return;
}
double num1 = Double.parseDouble(previousNumber);
double num2 = Double.parseDouble(currentNumber);
double result = 0;
switch (operation) {
case "+":
result = num1 + num2;
break;
case "-":
result = num1 - num2;
GCET 23
Mobile Application Development (202046712) 12202080501067
break;
case "×":
result = num1 * num2;
break;
case "÷":
if (num2 != 0) {
result = num1 / num2;
} else {
display.setText("Error");
return;
}
break;
}
// Format the result
if (result == (long) result) {
currentNumber = String.format("%d", (long) result);
} else {
currentNumber = String.format("%s", result);
}
previousNumber = "";
updateDisplay();
updatePreviousCalculationDisplay();
}
private void updateDisplay() {
if (currentNumber.isEmpty()) {
display.setText("0");
} else {
display.setText(currentNumber);
}
}
private void updatePreviousCalculationDisplay() {
String text = previousNumber + " " + operation;
previousCalculation.setText(text);
GCET 24
Mobile Application Development (202046712) 12202080501067
}
}
Output:
GCET 25
Mobile Application Development (202046712) 12202080501067
GCET 26