Калькулятор

Цей приклад демонструє створення простого калькулятора для Android із використанням найкращих практик, але без застосування архітектури MVVM.


Основні функціональні вимоги

  • Функції: додавання, віднімання, множення, ділення.
  • Інтерфейс: кнопки для цифр та операцій, а також поле для виведення результатів.
  • Обробка помилок: перевірка введення та уникнення поділу на нуль.

Структура проєкту

  1. MainActivity — головна активність.
  2. Розмітка — файл XML для UI.

Файл розмітки activity_main.xml

Розмітка містить:

  • Поле для введення та відображення результатів.
  • Кнопки для цифр та математичних операцій.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp">

    <EditText
        android:id="@+id/editTextResult"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="0"
        android:textSize="24sp"
        android:gravity="right"
        android:inputType="none"
        android:focusable="false" />

    <GridLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:columnCount="4"
        android:paddingTop="16dp">

        <!-- Buttons for numbers -->
        <Button
            android:text="7"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_columnWeight="1"
            android:onClick="onNumberClick" />

        <Button
            android:text="8"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_columnWeight="1"
            android:onClick="onNumberClick" />

        <Button
            android:text="9"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_columnWeight="1"
            android:onClick="onNumberClick" />

        <Button
            android:text="/"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_columnWeight="1"
            android:onClick="onOperatorClick" />

        <!-- Кнопки другого ряду -->
        <Button
            android:text="4"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_columnWeight="1"
            android:onClick="onNumberClick" />

        <Button
            android:text="5"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_columnWeight="1"
            android:onClick="onNumberClick" />

        <Button
            android:text="6"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_columnWeight="1"
            android:onClick="onNumberClick" />

        <Button
            android:text="*"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_columnWeight="1"
            android:onClick="onOperatorClick" />

        <!-- Кнопки третього ряду -->
        <Button
            android:text="1"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_columnWeight="1"
            android:onClick="onNumberClick" />

        <Button
            android:text="2"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_columnWeight="1"
            android:onClick="onNumberClick" />

        <Button
            android:text="3"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_columnWeight="1"
            android:onClick="onNumberClick" />

        <Button
            android:text="-"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_columnWeight="1"
            android:onClick="onOperatorClick" />

        <!-- Кнопки останнього ряду -->
        <Button
            android:text="0"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_columnWeight="1"
            android:onClick="onNumberClick" />

        <Button
            android:text="C"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_columnWeight="1"
            android:onClick="onClearClick" />

        <Button
            android:text="."
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_columnWeight="1"
            android:onClick="onDecimalClick" />

        <Button
            android:text="+"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_columnWeight="1"
            android:onClick="onOperatorClick" />

    </GridLayout>

    <Button
        android:text="="
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onEqualClick" />
</LinearLayout>

Код MainActivity.java

Головна логіка обробки подій натискання кнопок.

package com.example.calculator;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {
    private EditText editTextResult;
    private String currentOperator = "";
    private double firstValue = 0;
    private boolean isOperatorClicked = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        editTextResult = findViewById(R.id.editTextResult);
    }

    public void onNumberClick(View view) {
        Button button = (Button) view;
        String currentText = editTextResult.getText().toString();

        if (isOperatorClicked) {
            currentText = "";
            isOperatorClicked = false;
        }

        editTextResult.setText(currentText + button.getText().toString());
    }

    public void onOperatorClick(View view) {
        Button button = (Button) view;
        currentOperator = button.getText().toString();
        firstValue = Double.parseDouble(editTextResult.getText().toString());
        isOperatorClicked = true;
    }

    public void onEqualClick(View view) {
        double secondValue = Double.parseDouble(editTextResult.getText().toString());
        double result = 0;

        switch (currentOperator) {
            case "+":
                result = firstValue + secondValue;
                break;
            case "-":
                result = firstValue - secondValue;
                break;
            case "*":
                result = firstValue * secondValue;
                break;
            case "/":
                if (secondValue != 0) {
                    result = firstValue / secondValue;
                } else {
                    editTextResult.setText("Error");
                    return;
                }
                break;
        }

        editTextResult.setText(String.valueOf(result));
    }
}

Висновок

Цей проєкт демонструє основи створення функціонального калькулятора. Його можна покращити, використовуючи архітектурні підходи (MVVM) або додати більш складні операції.