App Tutorial

App Calcolatrice Android: Guida Completa con Esempi Java

App Calcolatrice Android in Android Studio – Guida Completa

Se stai cercando un esempio pratico per creare da zero un’App Calcolatrice Android in Android Studio, questa guida fa per te. Partiremo dalla creazione del layout XML con tutti i pulsanti della calcolatrice fino ad arrivare alla configurazione completa della classe MainActivity.java, così da ottenere un’app funzionante, pulita e facilmente estendibile.

App Calcolatrice Android realizzata con Android Studio

Cos’è l’App Calcolatrice Android?

L’App Calcolatrice Android che realizzeremo è una calcolatrice base ma completa, sviluppata in Java. L’interfaccia prevede un display per mostrare l’input corrente e l’operazione in corso, insieme a tutti i pulsanti numerici e agli operatori fondamentali: addizione, sottrazione, moltiplicazione, divisione, virgola decimale, cancellazione e calcolo del quadrato () del numero inserito. Il progetto è pensato per essere chiaro e didattico, ideale come esercizio per consolidare le basi dello sviluppo Android.

Passo 1 – Creare il layout activity_main.xml

Per prima cosa configuriamo il layout della nostra App Calcolatrice Android. Utilizzeremo un LinearLayout verticale che contiene due TextView (uno per il valore corrente e uno per l’operazione in corso) e una TableLayout con le varie righe di pulsanti. La disposizione dei pulsanti è la seguente:

  • Prima riga: C, 0, , ÷
  • Seconda riga: 7, 8, 9, ×
  • Terza riga: 4, 5, 6,
  • Quarta riga: 1, 2, 3, +
  • Quinta riga: ., = (gli altri due spazi possono essere lasciati vuoti o riutilizzati per funzioni future)

Ecco il codice completo di activity_main.xml con tutti gli ID già pronti per essere utilizzati in MainActivity.java:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp">

    <TextView
        android:id="@+id/textDue"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="8dp"
        android:gravity="end"
        android:textSize="18sp"
        android:textColor="@android:color/darker_gray" />

    <TextView
        android:id="@+id/textUno"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="16dp"
        android:gravity="end"
        android:textSize="32sp"
        android:textColor="@android:color/black" />

    <TableLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <TableRow
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center_horizontal">

            <Button
                android:id="@+id/bCancel"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_margin="4dp"
                android:layout_weight="1"
                android:text="C" />

            <Button
                android:id="@+id/bZero"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_margin="4dp"
                android:layout_weight="1"
                android:text="0" />

            <Button
                android:id="@+id/pTre"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_margin="4dp"
                android:layout_weight="1"
                android:text="x²" />

            <Button
                android:id="@+id/bDiviso"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_margin="4dp"
                android:layout_weight="1"
                android:text="÷" />

        </TableRow>

        <TableRow
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center_horizontal">

            <Button
                android:id="@+id/bSette"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_margin="4dp"
                android:layout_weight="1"
                android:text="7" />

            <Button
                android:id="@+id/bOtto"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_margin="4dp"
                android:layout_weight="1"
                android:text="8" />

            <Button
                android:id="@+id/bNove"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_margin="4dp"
                android:layout_weight="1"
                android:text="9" />

            <Button
                android:id="@+id/bPer"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_margin="4dp"
                android:layout_weight="1"
                android:text="×" />

        </TableRow>

        <TableRow
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center_horizontal">

            <Button
                android:id="@+id/bQuattro"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_margin="4dp"
                android:layout_weight="1"
                android:text="4" />

            <Button
                android:id="@+id/bCinque"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_margin="4dp"
                android:layout_weight="1"
                android:text="5" />

            <Button
                android:id="@+id/bSei"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_margin="4dp"
                android:layout_weight="1"
                android:text="6" />

            <Button
                android:id="@+id/bMeno"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_margin="4dp"
                android:layout_weight="1"
                android:text="-" />

        </TableRow>

        <TableRow
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center_horizontal">

            <Button
                android:id="@+id/bUno"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_margin="4dp"
                android:layout_weight="1"
                android:text="1" />

            <Button
                android:id="@+id/bDue"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_margin="4dp"
                android:layout_weight="1"
                android:text="2" />

            <Button
                android:id="@+id/bTre"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_margin="4dp"
                android:layout_weight="1"
                android:text="3" />

            <Button
                android:id="@+id/bPiu"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_margin="4dp"
                android:layout_weight="1"
                android:text="+" />

        </TableRow>

        <TableRow
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center_horizontal">

            <Button
                android:id="@+id/bVirgola"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_margin="4dp"
                android:layout_weight="1"
                android:text="." />

            <Button
                android:id="@+id/bUguale"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_margin="4dp"
                android:layout_weight="1"
                android:text="=" />

            <Space
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1" />

            <Space
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1" />

        </TableRow>

    </TableLayout>

</LinearLayout>

Passo 2 – Configurare MainActivity.java

Definito il layout, possiamo passare alla logica dell’applicazione. Nella classe MainActivity dichiariamo le variabili per i TextView e per tutti i Button, le costanti che identificano le operazioni supportate e le variabili per memorizzare i valori numerici. Nel metodo onCreate() inizializziamo i riferimenti con findViewById() e impostiamo gli OnClickListener per gestire:

  • l’inserimento dei numeri (0–9),
  • gli operatori di base (+, -, ×, ÷),
  • il calcolo del quadrato () tramite il pulsante pTre,
  • il tasto uguale,
  • il tasto di cancellazione (breve pressione per cancellare l’ultimo carattere, lunga pressione per azzerare tutto),
  • la virgola/punto decimale.

Di seguito il codice Java completo di MainActivity.java:

package com.example.calcolatrice;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    private TextView textUno;
    private TextView textDue;

    private Button bPiu;
    private Button bMeno;
    private Button bPer;
    private Button bDiviso;

    private Button bZero;
    private Button bUno;
    private Button bDue;
    private Button bTre;
    private Button bQuattro;
    private Button bCinque;
    private Button bSei;
    private Button bSette;
    private Button bOtto;
    private Button bNove;

    private Button bUguale;
    private Button bVirgola;
    private Button bCancel;
    private Button pTre; // pulsante per x²

    private char ACTION;
    private double ValoreUno = Double.NaN;
    private double ValoreDue;

    private static final char Addizione = '+';
    private static final char Sottrazione = '-';
    private static final char Moltiplicazione = '×';
    private static final char Divisione = '÷';
    private static final char EQU = '=';

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

        // TextView
        textUno = findViewById(R.id.textUno);
        textDue = findViewById(R.id.textDue);

        // Bottoni numerici
        bZero = findViewById(R.id.bZero);
        bUno = findViewById(R.id.bUno);
        bDue = findViewById(R.id.bDue);
        bTre = findViewById(R.id.bTre);
        bQuattro = findViewById(R.id.bQuattro);
        bCinque = findViewById(R.id.bCinque);
        bSei = findViewById(R.id.bSei);
        bSette = findViewById(R.id.bSette);
        bOtto = findViewById(R.id.bOtto);
        bNove = findViewById(R.id.bNove);

        // Bottoni operatori
        bPiu = findViewById(R.id.bPiu);
        bMeno = findViewById(R.id.bMeno);
        bPer = findViewById(R.id.bPer);
        bDiviso = findViewById(R.id.bDiviso);

        // Altri pulsanti
        bUguale = findViewById(R.id.bUguale);
        bVirgola = findViewById(R.id.bVirgola);
        bCancel = findViewById(R.id.bCancel);
        pTre = findViewById(R.id.pTre);

        // Listener per i numeri 0–9
        View.OnClickListener numberListener = new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Button b = (Button) v;
                clearErrorIfNeeded();
                textUno.setText(textUno.getText().toString() + b.getText().toString());
            }
        };

        bZero.setOnClickListener(numberListener);
        bUno.setOnClickListener(numberListener);
        bDue.setOnClickListener(numberListener);
        bTre.setOnClickListener(numberListener);
        bQuattro.setOnClickListener(numberListener);
        bCinque.setOnClickListener(numberListener);
        bSei.setOnClickListener(numberListener);
        bSette.setOnClickListener(numberListener);
        bOtto.setOnClickListener(numberListener);
        bNove.setOnClickListener(numberListener);

        // Virgola/punto decimale
        bVirgola.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                clearErrorIfNeeded();
                String corrente = textUno.getText().toString();
                if (!corrente.contains(".")) {
                    if (corrente.isEmpty()) {
                        textUno.setText("0.");
                    } else {
                        textUno.setText(corrente + ".");
                    }
                }
            }
        });

        // Operatori di base
        bPiu.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                operatoreCliccato(Addizione, "+");
            }
        });

        bMeno.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                operatoreCliccato(Sottrazione, "-");
            }
        });

        bPer.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                operatoreCliccato(Moltiplicazione, "×");
            }
        });

        bDiviso.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                operatoreCliccato(Divisione, "÷");
            }
        });

        // Pulsante per il quadrato x² (pTre)
        pTre.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String testo = textUno.getText().toString();
                if (testo.isEmpty()) {
                    return;
                }

                double valore = Double.parseDouble(testo);
                double risultato = valore * valore;

                textDue.setText(formatResult(valore) + "²");
                textUno.setText(formatResult(risultato));
                ValoreUno = Double.NaN;
                ValoreDue = Double.NaN;
                ACTION = '\0';
            }
        });

        // Pulsante uguale
        bUguale.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (Double.isNaN(ValoreUno)) {
                    return;
                }

                String testo = textUno.getText().toString();
                if (testo.isEmpty()) {
                    textUno.setText("Errore");
                    textDue.setText("");
                    ValoreUno = Double.NaN;
                    return;
                }

                ValoreDue = Double.parseDouble(testo);
                calcola();
                ACTION = EQU;

                textDue.setText("");
                textUno.setText(formatResult(ValoreUno));
                ValoreUno = Double.NaN;
            }
        });

        // Cancellazione: breve pressione = cancella ultimo carattere, lunga pressione = reset totale
        bCancel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String corrente = textUno.getText().toString();
                if (!corrente.isEmpty()) {
                    textUno.setText(corrente.substring(0, corrente.length() - 1));
                } else {
                    resetCalcolatrice();
                }
            }
        });

        bCancel.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                resetCalcolatrice();
                return true;
            }
        });
    }

    private void operatoreCliccato(char azione, String simbolo) {
        String testo = textUno.getText().toString();
        if (testo.isEmpty()) {
            return;
        }

        if (!Double.isNaN(ValoreUno)) {
            ValoreDue = Double.parseDouble(testo);
            calcola();
        } else {
            ValoreUno = Double.parseDouble(testo);
        }

        ACTION = azione;
        textDue.setText(formatResult(ValoreUno) + " " + simbolo);
        textUno.setText("");
    }

    private void calcola() {
        switch (ACTION) {
            case Addizione:
                ValoreUno = ValoreUno + ValoreDue;
                break;
            case Sottrazione:
                ValoreUno = ValoreUno - ValoreDue;
                break;
            case Moltiplicazione:
                ValoreUno = ValoreUno * ValoreDue;
                break;
            case Divisione:
                if (ValoreDue == 0) {
                    textUno.setText("Errore");
                    ValoreUno = Double.NaN;
                } else {
                    ValoreUno = ValoreUno / ValoreDue;
                }
                break;
        }
    }

    private void clearErrorIfNeeded() {
        if ("Errore".contentEquals(textUno.getText())) {
            textUno.setText("");
        }
    }

    private void resetCalcolatrice() {
        ValoreUno = Double.NaN;
        ValoreDue = Double.NaN;
        textUno.setText("");
        textDue.setText("");
        ACTION = '\0';
    }

    private String formatResult(double value) {
        if (value == (long) value) {
            return String.valueOf((long) value);
        } else {
            return String.valueOf(value);
        }
    }
}

Metodi e funzionalità della Calcolatrice Android

La seguente tabella riassume i pulsanti principali dell’interfaccia e la funzione associata all’interno della nostra App Calcolatrice Android.

PulsanteFunzione
CCancella l’ultimo carattere inserito; pressione prolungata: reset completo della calcolatrice.
0–9Inserimento delle cifre numeriche nel display principale.
.Inserisce il separatore decimale (punto) se non è già presente nel numero corrente.
+Imposta l’operazione di addizione e memorizza il primo operando.
Imposta l’operazione di sottrazione e memorizza il primo operando.
×Imposta l’operazione di moltiplicazione e memorizza il primo operando.
÷Imposta l’operazione di divisione e memorizza il primo operando, con controllo della divisione per zero.
=Esegue il calcolo in base all’operatore selezionato e mostra il risultato nel display principale.
Calcola il quadrato del numero attualmente visualizzato e mostra risultato e operazione eseguita.

Conclusione: la tua App Calcolatrice Android è pronta

Seguendo questi passaggi hai costruito un’App Calcolatrice Android completa in Android Studio, partendo dal layout XML fino alla logica Java con gestione di operazioni base, decimali, cancellazione e calcolo del quadrato. A partire da questa base puoi aggiungere nuove funzioni (ad esempio percentuali, memoria o cambio di segno, notifiche tramite Toast o AlertDialog), migliorare lo stile grafico e utilizzare il progetto come punto di partenza per applicazioni più complesse.