Implementación de la calculadora de Android

1. Descripción general del proyecto

Este proyecto es una aplicación de calculadora sencilla que puede realizar las funciones básicas de una calculadora, como suma, resta, multiplicación y división. Usaremos Android Studio como herramienta de desarrollo.

2. Diseño del proyecto

1. Cree un nuevo proyecto de Android en Android Studio.
2. En el archivo de diseño (`activity_main.xml`) agregaremos un botón y una vista de texto para mostrar los resultados.
3. En el archivo de código (`MainActivity.java`), procesaremos la entrada del usuario y mostraremos los resultados del cálculo.

3. Desarrollo de proyectos

1. Archivo de diseño

Implemente el efecto de la página de inicio en el archivo de diseño `activity_main.xml`. Utilice componentes como "EditText" para ingresar procedimientos y resultados, y "Botón" para realizar cálculos.

<?xml version="1.0" encoding="utf-8"?>
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <GridLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="top"
        android:columnCount="1"
        android:orientation="vertical"
        android:rowCount="2">

        <EditText
            android:id="@+id/mresult"
            android:layout_width="match_parent"
            android:layout_height="100dp"
            android:enabled="false"
            android:hint="这里显示结果"
            android:textColor="@color/black" />


        <EditText
            android:id="@+id/mjsgc"
            android:layout_width="match_parent"
            android:layout_height="100dp"
            android:hint="这里显示计算过程" />
    </GridLayout>

    <GridLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center|top"
        android:orientation="horizontal"

        android:columnCount="4"
        android:rowCount="5"
        >

        <Button
            android:id="@+id/btnqc"
            android:layout_width="180dp"
            android:layout_height="60dp"
            android:layout_columnSpan="2"
            android:text="C" />

        <Button
            android:id="@+id/btndel"
            android:layout_width="90dp"
            android:layout_height="60dp"
            android:layout_columnSpan="1"
            android:text="del" />

        <Button
            android:id="@+id/btnc"
            android:layout_width="90dp"
            android:layout_height="60dp"
            android:text="/" />

        <Button
            android:id="@+id/btn7"
            android:layout_width="90dp"
            android:layout_height="60dp"
            android:text="7" />

        <Button
            android:id="@+id/btn8"
            android:layout_width="90dp"
            android:layout_height="60dp"
            android:text="8" />

        <Button
            android:id="@+id/btn9"
            android:layout_width="90dp"
            android:layout_height="60dp"
            android:text="9" />

        <Button
            android:id="@+id/btnx"
            android:layout_width="90dp"
            android:layout_height="60dp"
            android:text="*" />


        <Button
            android:id="@+id/btn4"
            android:layout_width="90dp"
            android:layout_height="60dp"
            android:text="4" />

        <Button
            android:id="@+id/btn5"
            android:layout_width="90dp"
            android:layout_height="60dp"
            android:text="5" />

        <Button
            android:id="@+id/btn6"
            android:layout_width="90dp"
            android:layout_height="60dp"
            android:text="6" />

        <Button
            android:id="@+id/btnj"
            android:layout_width="90dp"
            android:layout_height="63dp"
            android:text="-" />

        <Button
            android:id="@+id/btn1"
            android:layout_width="90dp"
            android:layout_height="60dp"
            android:text="1" />

        <Button
            android:id="@+id/btn2"
            android:layout_width="90dp"
            android:layout_height="60dp"
            android:text="2" />

        <Button
            android:id="@+id/btn3"
            android:layout_width="90dp"
            android:layout_height="60dp"
            android:text="3" />


        <Button
            android:id="@+id/btn1j"
            android:layout_width="90dp"
            android:layout_height="60dp"
            android:layout_rowSpan="1"
            android:text="+" />

        <Button
            android:id="@+id/zhengfu"
            android:layout_width="90dp"
            android:layout_height="60dp"
            android:text="预留" />

        <Button
            android:id="@+id/btn0"
            android:layout_width="90dp"
            android:layout_height="60dp"
            android:layout_columnSpan="1"
            android:text="0" />

        <Button
            android:id="@+id/btnd"
            android:layout_width="wrap_content"
            android:layout_height="60dp"
            android:text="." />


        <Button
            android:id="@+id/btn1d"
            android:layout_width="90dp"
            android:layout_height="60dp"
            android:text="=" />

        <Space />
    </GridLayout>

</GridLayout>

Diseño GridLayout: si desea lograr el efecto de diseño de combinación de filas, utilizar el diseño GridLayout es la forma más sencilla y sencilla de lograrlo.

Atributos comunes: android:orientation establece la visualización horizontal o vertical        android:columnCount establece el número de columnas android:rowCount establece el número de filas

Atributos de control secundario: android:layout_rowSpan fusiona varias columnas verticalmente en   android:layout_columSpan fusiona varias filas horizontalmente        android:layout_gravityLa posición del componente principal

 La imagen de arriba es el efecto de la página de inicio.

2. Archivos de código

En el archivo de código `MainActivity.java` agregaremos un detector de eventos de clic para el botón, procesaremos la entrada del usuario y mostraremos los resultados del cálculo.

package com.example.a4_11;


import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    //显式结果和计算过程
    private EditText mresult, mjsgc;
    //数字0-9
    private Button btn1, btn2, btn3, btn4, btn5, btn6, btn7, btn8, btn9, btn0;
    private Button btnd; //小数点
    //运算符
    private Button btn1j, btnj, btnx, btnc, btn1d; //加减乘除等于

    //功能键
    private Button btndel, btnqc;//回退键和清除所有键
    boolean equals_flag = false;//等号标识

    boolean del_flag = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //数字0-9
        btn1 = findViewById(R.id.btn1);
        btn2 = findViewById(R.id.btn2);
        btn3 = findViewById(R.id.btn3);
        btn4 = findViewById(R.id.btn4);
        btn5 = findViewById(R.id.btn5);
        btn6 = findViewById(R.id.btn6);
        btn7 = findViewById(R.id.btn7);
        btn8 = findViewById(R.id.btn8);
        btn9 = findViewById(R.id.btn9);
        btn0 = findViewById(R.id.btn0);
        //运算符
        btn1j = findViewById(R.id.btn1j);// +
        btnj = findViewById(R.id.btnj);// -
        btnx = findViewById(R.id.btnx);// *
        btnc = findViewById(R.id.btnc); // /
        btnd = findViewById(R.id.btnd);//小数点
        btn1d = findViewById(R.id.btn1d);// =

        btndel = findViewById(R.id.btndel);//退回
        btnqc = findViewById(R.id.btnqc);//清除

        mresult = findViewById(R.id.mresult);//结果框
        mjsgc = findViewById(R.id.mjsgc);//输入过程框

        //点击事件0-9
        btn0.setOnClickListener(this);
        btn1.setOnClickListener(this);
        btn2.setOnClickListener(this);
        btn3.setOnClickListener(this);
        btn4.setOnClickListener(this);
        btn5.setOnClickListener(this);
        btn6.setOnClickListener(this);
        btn7.setOnClickListener(this);
        btn8.setOnClickListener(this);
        btn9.setOnClickListener(this);
        btnd.setOnClickListener(this);
        //点击事件运算符
        btn1j.setOnClickListener(this);
        btnj.setOnClickListener(this);
        btnx.setOnClickListener(this);
        btnc.setOnClickListener(this);
        btn1d.setOnClickListener(this);

        btndel.setOnClickListener(this);
        btnqc.setOnClickListener(this);
    }

    //读取每个按钮的点击的内容
    @Override
    public void onClick(View v) {
        //获取输入框和结果框的内容
        String input = mjsgc.getText().toString();
        String output = mresult.getText().toString();
        switch (v.getId()) {
            case R.id.btn0:
            case R.id.btn1:
            case R.id.btn2:
            case R.id.btn3:
            case R.id.btn4:
            case R.id.btn5:
            case R.id.btn6:
            case R.id.btn7:
            case R.id.btn8:
            case R.id.btn9:
            case R.id.btnd:
                if (equals_flag) {
                    //按过等号之后,重新点数字们
                    equals_flag = false;
                    mjsgc.setText(((Button) v).getText());
                    mresult.setText(((Button) v).getText());
                } else {
                    mjsgc.setText(input + ((Button) v).getText());
                    mresult.setText(((Button) v).getText());
                }
                break;
            case R.id.btn1j:
            case R.id.btnj:
            case R.id.btnx:
            case R.id.btnc:
                if (equals_flag) {
                    //按过等号之后,重新点数字
                    equals_flag = false;
                    mjsgc.setText(output + " " + ((Button) v).getText() + " ");
                } else {
                    mjsgc.setText(input + " " + ((Button) v).getText() + " ");
                }
                break;
            case R.id.btndel:
                equals_flag = false;
                if (input.length() > 0) {//如果获取到的内容不为空
                    mjsgc.setText(input.substring(0, input.length() - 1));
                } else {
                    mresult.setText(null);
                    mjsgc.setText(null);
                }
                break;
            case R.id.btnqc:
                mresult.setText(null);
                mjsgc.setText(null);
                break;
            case R.id.btn1d://运算结果  =
                getResult();//调用处理结果集的方法
                break;
        }
    }

    //运算结果的方法
    public void getResult() {
        try {
            String JSGC = mjsgc.getText().toString();//获取计算过程文本框的内容
            double dResult = 0;
            int iResult = 0;

            //如果直接点等号
            if (JSGC.equals("") || JSGC == null) {
                return;
            }
            if (equals_flag) {
                equals_flag = false;
                return;
            }
            equals_flag = true;//点击过等号之后,标识亮起

            String s1, s2, op;

            //运算符前的数字
            s1 = JSGC.substring(0, JSGC.indexOf(" "));
            //运算符
            op = JSGC.substring(JSGC.indexOf(" ") + 1, JSGC.indexOf(" ") + 2);
            //运算符后的数字
            s2 = JSGC.substring(JSGC.indexOf(" ") + 3);

            double d1, d2;
            //s1转化成double型
            if (!s1.equals("")) {
                if (s1.charAt(0) == '.') {
                    s1 = "0" + s1;//如果简写小数(如0.03简写.03,需要帮它完整输出数字)
                }
                d1 = Double.parseDouble(s1);//正常转化
            } else {
                d1 = 0;//如果首次只输入了“运算符 数字”,如: + 4,则返回:0 + 4
                mjsgc.setText("0" + JSGC);
            }

            //s2转化成double型
            if (!s2.equals("")) {
                if (s2.charAt(0) == '.') {
                    s2 = "0" + s2;
                }
                d2 = Double.parseDouble(s2);
            } else {
                d2 = d1;
                if (s1.equals("")) {
                    mjsgc.setText("0" + JSGC + "0");//如果只输入了运算符,如 + ,输出0 + 0,得结果0
                } else {
                    mjsgc.setText(JSGC + s1);//如果不输入s2,如,9 * ,输出9 * 9 ,得结果81
                }
            }


            if (op.equals("+")) {//如果是 +
                dResult = d1 + d2;
            } else if (op.equals("-")) {
                dResult = d1 - d2;
            } else if (op.equals("*")) {
                dResult = d1 * d2;
            } else if (op.equals("/")) {
                if (d2 == 0) { //如果被除数是0
                    Toast.makeText(this, "除数不能为0", Toast.LENGTH_SHORT).show();
                    return;
                } else {//否则执行正常是除法运算
                    dResult = d1 / d2;
                }
            }


            if (s1.contains(".") || s2.contains(".") || op.equals("/")) {
                mresult.setText(dResult + "");//如果是小数、或者除法运算
            } else {
                iResult = (int) dResult; //否则都是整型
                mresult.setText(iResult + "");
            }

        } catch (Exception e) {
            Toast.makeText(this, e.toString(), Toast.LENGTH_SHORT).show();
            Log.i("JSQ", e.toString());
        }

    }
}

3. Ejecute el proyecto

Haga clic en el botón ejecutar para ejecutar correctamente.

Representaciones de operación 

3. Experiencia

1. Comprender el diseño

Comprender cómo diseñar e implementar una interfaz de usuario de calculadora es un paso importante. Necesito pensar en cómo colocar varios controles (como cuadros de texto, botones, etc.) en la pantalla para obtener la mejor experiencia de usuario.

2. Comprender el manejo de eventos de Android

Cuando los usuarios realizan operaciones en la calculadora (como hacer clic en botones o ingresar números), se requiere la lógica de procesamiento de eventos correspondiente para responder a estas operaciones. Esto implica comprender el mecanismo de manejo de eventos de Android, como eventos de clic, eventos de entrada, etc.

3. Aprendizaje e innovación

Desarrollar calculadoras para Android me hizo comprender que es necesario aprender nuevas tecnologías y conocimientos, pero lo más importante es poder aplicar estos conocimientos a problemas reales e innovar. Este proceso me dio una nueva comprensión del aprendizaje.

4. Comprender el almacenamiento de datos de Android

En este proyecto, necesito almacenar algunos datos en la aplicación, como números y acciones ingresadas por el usuario. Necesito entender cómo lograr esto usando la tecnología de almacenamiento de datos de Android.

5. Depuración y prueba

Durante el proceso de desarrollo, necesito dedicar mucho tiempo a depurar y probar para asegurarme de que la calculadora funcione correctamente y que la interfaz de usuario sea amigable. Esto me enseñó la importancia de las pruebas y cómo escribir casos de prueba eficaces para encontrar y corregir errores.

4. Resumen

En este proyecto, aprendí cómo implementar la función de calculadora en una aplicación de Android. Cómo crear y administrar vistas en Actividad. Aprenda a utilizar archivos de diseño XML para diseñar y diseñar interfaces. Requiere familiaridad con varios elementos de diseño como `GridLayout` . Aprenda a utilizar varios componentes de la interfaz de usuario para lograr la interacción del usuario. Esto incluye cómo utilizar componentes como `EditText`, `Button`, `TextView`, etc. para ingresar y mostrar texto. Al implementar la función de calculadora, es necesario comprender las reglas y algoritmos de diversas operaciones. Esto incluye los principios básicos de suma, resta, multiplicación y división, así como cómo manejar expresiones complejas como números de coma flotante y paréntesis. Puede dominar los conceptos básicos del desarrollo de aplicaciones de Android, incluido el diseño, el manejo de eventos y las funciones de cálculo. Esto sentará una base sólida para seguir aprendiendo en el campo del desarrollo de Android.

Supongo que te gusta

Origin blog.csdn.net/m0_72104085/article/details/131307062
Recomendado
Clasificación