[JAVA] J'ai créé une application de calculatrice sur Android

Aperçu

C'est une application de calcul simple. Je l'ai fait pour étudier Android.

Android Studio 3.6.2 TableLayout caluculation.PNG

Ingéniosité / difficulté

-Créer un bouton qui chevauche les colonnes dans TableLayout J'ai imbriqué un LinearLayout dans une ligne Table.

・ Afficher les images uniquement dans des conditions spécifiques Modifié pour définir l'image dans imageView avec setImageResource.

・ Traitement qui donne la priorité à la multiplication et à la division Stocker la formule de calcul dans ArrayList → Rechercher × ÷ et effectuer un calcul de priorité → Supprimer la partie calculée de la liste → Ajouter le résultat du calcul à la liste → Répéter jusqu'à ce que × ÷ disparaisse → Puis effectuer + -calcul Je l'ai implémenté de cette manière.

・ Perdez l'erreur de calcul du double Le problème que "1.0d --0.9d = 0.099999999 ..." s'affiche. Je l'ai résolu en utilisant la classe BigDecimal.

・ Une erreur se produit lorsque la division n'est pas divisible. Dans BigDecimal, ArithmeticException se produit lorsqu'un nombre qui n'est pas divisible par division (fraction circulaire) apparaît. Pour éviter cette erreur, le nombre avec la 11e décimale est arrondi. Cependant, si vous le faites, il y aura un problème que même lorsque le nombre est divisible, il sera affiché jusqu'au 10ème chiffre. Ce sera comme ça → 4/2 = 2.0000000000 Pour éviter cela, la division est incluse dans try-catch et le nombre au 11e chiffre est arrondi uniquement lorsqu'une ArithmeticException se produit.

· Correction d'un bug Évitez de taper plusieurs points décimaux. Ne frappez pas + - × ÷ = dans un endroit involontaire. = Divers comportements après avoir cliqué sur le bouton. Il y avait beaucoup d'autres choses ...

Comment créer un bouton de colonne croisée dans TableLayout

Narrow LinearLayout à l'intérieur de la ligne Table.

activity_main.xml


<TableRow
        android:id="@+id/row2"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="2">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">

            <Button
                android:id="@+id/button4"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:text="@string/button4"
                android:textSize="25sp"
                android:onClick="btnCurrent_onClick"/>

            <Button
                android:id="@+id/button1"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:text="@string/button1"
                android:textSize="25sp"
                android:onClick="btnCurrent_onClick"/>

        </LinearLayout>

        <!--Bouton sur les lignes-->
        <Button
            android:id="@+id/buttonPlus"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_margin="5dp"
            android:background="#FFBF00"
            android:text="@string/buttonPlus"
            android:textSize="25sp"
            android:onClick="btnCurrent_onClick"/>
</TableRow>

        

Impressions / réflexion

J'ai beaucoup appris parce que je ne pouvais pas comprendre avant de réussir. Je vais continuer à apprendre dans le cycle de lecture d'un livre → essayer de le faire.

Le point de réflexion est qu'il est plein de phrases si. Je veux écrire un code plus propre.

Code complet

MainActivity.java


package to.msn.wings.caluculator;

import android.annotation.SuppressLint;
import android.content.Context;
import android.os.Bundle;
import android.text.Editable;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {

    List<String> stringList = new ArrayList<>();//Liste pour stocker les caractères d'entrée
    int decimalPointCount = 0; //Une variable pour empêcher les clics continus sur le bouton de la virgule décimale.
    int ClickedFormulaOnce = 0; // +-/*Pour déterminer si même un seul est inclus dans la formule de calcul.+-*/Parce qu'il ne peut pas être calculé sans même un.
    int formulaContinuousClick = 0; // +-/*Une variable pour empêcher les clics continus sur le bouton.

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

    //Méthode de calcul
    public void calculation(TextView txt) {
        //Obtenez tous les caractères dans TextView et stockez-les dans un tableau.
        String txtAll = txt.getText().toString();

        //Une expression régulière qui inclut également le délimiteur lui-même dans le tableau
        //Expressions régulières((?<=[+×÷-])|(?=[+×÷-]))Le sens de+-Cela signifie séparer immédiatement avant et après × ÷.
        String[] stringArray = txtAll.split("((?<=[+×÷-])|(?=[+×÷-]))", 0);

        //Après avoir stocké dans le tableau, supprimez tous les caractères dans TextView.
        txt.setText(null);
        //Stockez tous les tableaux dans ArrayList.
        for(String s:stringArray) {
            stringList.add(s);
        }
        //Contrairement à double, Big Decimal n'a pas d'erreur.
        BigDecimal bigDecimalResultValue = new BigDecimal("0.0");
        //Traitement de multiplication et de division
        for(int i = 1; i < stringList.size(); i += 2) {
            if(stringList.get(i).equals("×")) {
                bigDecimalResultValue = new BigDecimal(stringList.get(i-1)).multiply(new BigDecimal(stringList.get(i+1)));
                //Supprimez les nombres et expressions calculés de stringList. Exemple: "2*3+"2" sur "1"*Supprimez la partie "3".
                stringList.remove(i-1);
                stringList.remove(i-1);
                stringList.remove(i-1);
                //Ajoutez le résultat du calcul à stringList. Exemple: "2*3+1 "à" 6+Défini sur 1 ".
                stringList.add(i-1, String.valueOf(bigDecimalResultValue));
                //J'ai supprimé 3 stringLists et ajouté 1 donc soustrayez 2 de i.
                i -= 2;
            } else if (stringList.get(i).equals("÷")) {
                //Lorsque la division Bigdecimal est un nombre indivisible, une erreur ArithmeticException se produit. Par conséquent, placez-le dans trycath.
                //Lorsqu'il est finalement divisible, 00000 n'est pas perdu après la virgule décimale.
                //Arrondissez le 11e chiffre uniquement lorsqu'il n'est pas divisible.
                try {
                    bigDecimalResultValue = new BigDecimal(stringList.get(i-1)).divide(new BigDecimal(stringList.get(i+1)));
                } catch (ArithmeticException e) {
                    bigDecimalResultValue = new BigDecimal(stringList.get(i-1)).divide(new BigDecimal(stringList.get(i+1)), 10, RoundingMode.HALF_UP);//Arrondi. Afficher jusqu'au 10e chiffre.
                }
                stringList.remove(i-1);
                stringList.remove(i-1);
                stringList.remove(i-1);
                stringList.add(i-1, String.valueOf(bigDecimalResultValue));
                i -= 2;
            }
        }
        //Traitement d'addition et de soustraction
        //La multiplication et la division ont déjà été traitées, il suffit donc d'ajouter et de soustraire de l'avant.
        while(stringList.size() > 1) {
            if(stringList.get(1).equals("+")) {
                bigDecimalResultValue = new BigDecimal(stringList.get(0)).add(new BigDecimal(stringList.get(2)));
                stringList.remove(0);
                stringList.remove(0);
                stringList.remove(0);
                stringList.add(0, String.valueOf(bigDecimalResultValue));
            } else if (stringList.get(1).equals("-")) {
                bigDecimalResultValue = new BigDecimal(stringList.get(0)).subtract(new BigDecimal(stringList.get(2)));
                stringList.remove(0);
                stringList.remove(0);
                stringList.remove(0);
                stringList.add(0, String.valueOf(bigDecimalResultValue));
            }
        }
        if(String.valueOf(bigDecimalResultValue).equals("3")) {
            //Traitement pour afficher l'image uniquement lorsque le résultat est 3
            //Obtenir un objet ImageView basé sur l'ID
            @SuppressLint("ResourceType")
            ImageView iv = this.findViewById(R.id.imageView);
            //Définir l'image dans le dossier dessinable
            iv.setImageResource(R.drawable.nabeatsu);
            txt.setText("Casseroles du monde");
        } else {
            txt.setText(String.valueOf(bigDecimalResultValue));
        }
        //Effacez la liste après avoir affiché les résultats.
        stringList.clear();
    }
    public void btnCurrent_onClick(View view) {
        //Obtenir la vue texte
        TextView txt = findViewById(R.id.textView);
        //Jugez le bouton cliqué par l'instruction switch. Afficher dans le texte.
        switch (view.getId()) {
            case R.id.button0:
                txt.append("0");
                formulaContinuousClick = 0;
                break;
            case R.id.button1:
                txt.append("1");
                formulaContinuousClick = 0;
                break;
            case R.id.button2:
                txt.append("2");
                formulaContinuousClick = 0;
                break;
            case R.id.button3:
                txt.append("3");
                formulaContinuousClick = 0;
                break;
            case R.id.button4:
                txt.append("4");
                formulaContinuousClick = 0;
                break;
            case R.id.button5:
                txt.append("5");
                formulaContinuousClick = 0;
                break;
            case R.id.button6:
                txt.append("6");
                formulaContinuousClick = 0;
                break;
            case R.id.button7:
                txt.append("7");
                formulaContinuousClick = 0;
                break;
            case R.id.button8:
                txt.append("8");
                formulaContinuousClick = 0;
                break;
            case R.id.button9:
                txt.append("9");
                formulaContinuousClick = 0;
                break;

            case R.id.buttonBS:
                formulaContinuousClick = 0;
                //Obtenir une instance modifiable
                Editable editable = Editable.Factory.getInstance().newEditable(txt.getText());

                //Traitement pour supprimer le dernier caractère à chaque pression sur le bouton
                if(editable.length() > 0){
                    //Le premier argument de suppression est le début du caractère que vous souhaitez supprimer,Le deuxième argument est la fin du caractère que vous souhaitez supprimer
                    editable.delete(editable.length()-1, editable.length());
                }
                //Définir dans TextView
                txt.setText(editable, TextView.BufferType.EDITABLE);

                break;

            case R.id.buttonClear:
                decimalPointCount = 0;
                ClickedFormulaOnce = 0;
                formulaContinuousClick = 0;
                stringList.clear();

                //Pour effacer les images
                @SuppressLint("ResourceType")
                ImageView iv = this.findViewById(R.id.imageView);
                iv.setImageDrawable(null);
                txt.setText(null);
                break;

            case R.id.buttonPoint:
                //Jugement qui empêche les coups répétés de la virgule décimale.
                if (decimalPointCount == 0) {
                    txt.append(".");
                    decimalPointCount = 1;
                }
                break;

            //D'ici+-/*Que se passe-t-il lorsque vous cliquez?
            //formuleContinuCliquez+-*/=Pour éviter les clics continus.
            //Formule cliquée une fois+-*/Pour déterminer si vous avez cliqué une seule fois.
            case R.id.buttonPlus:
                formulaContinuousClick++;
                // +-/*Traitement lorsque vous appuyez sur. Ignorer les robinets continus.
                //En outre, s'il n'y a rien dans TextView, il sera ignoré.
                if(formulaContinuousClick == 1 && !(txt.getText().toString().equals(""))) {
                    ClickedFormulaOnce = 1;
                    txt.append("+");
                }
                decimalPointCount = 0; //Renvoie le nombre de clics du point décimal à 0.
                break;

            case R.id.buttonMinus:
                formulaContinuousClick++;
                if(formulaContinuousClick == 1 && !(txt.getText().toString().equals(""))) {
                    ClickedFormulaOnce = 1;
                    txt.append("-");
                }
                decimalPointCount = 0;
                break;

            case R.id.buttonMulti:
                formulaContinuousClick++;
                ClickedFormulaOnce = 1;
                if(formulaContinuousClick == 1 && !(txt.getText().toString().equals(""))) {
                    ClickedFormulaOnce = 1;
                    txt.append("×");
                }
                decimalPointCount = 0;
                break;

            case R.id.buttonDiv:
                formulaContinuousClick++;
                ClickedFormulaOnce = 1;
                if(formulaContinuousClick == 1 && !(txt.getText().toString().equals(""))) {
                    ClickedFormulaOnce = 1;
                    txt.append("÷");
                }
                decimalPointCount = 0;
                break;

            case R.id.buttonEqual:
                if(ClickedFormulaOnce == 1) {
                    formulaContinuousClick++;
                }
                if (ClickedFormulaOnce == 1 && formulaContinuousClick == 1) {
                    formulaContinuousClick = 0;
                    ClickedFormulaOnce = 0;
                    //Empêche l'ajout de décimales supplémentaires lorsque le résultat du calcul comporte une décimale. Exemple "3.3+0.1=3.4 → Cliquez sur le point décimal → "3".4."Tel
                    decimalPointCount = 1;
                    if(txt.getText().toString().length() > 56) {
                        Context context = getApplicationContext();
                        Toast.makeText(context, "Le nombre de caractères dépasse la limite supérieure de 56 caractères.", Toast.LENGTH_LONG).show();
                    } else {
                        calculation(txt);
                    }
                }
                break;
        }
    }
}

activity_main.xml


<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:shrinkColumns="0,1,2,3,4">


    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="2"
        android:orientation="vertical">

        <TextView
            android:id="@+id/textView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom|end"
            android:textSize="50sp" />

        <ImageView
            android:id="@+id/imageView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal" />
    </LinearLayout>


    <TableRow
        android:id="@+id/row1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="2">

        <Button
            android:id="@+id/button7"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:onClick="btnCurrent_onClick"
            android:text="@string/button7"
            android:textSize="25sp" />

        <Button
            android:id="@+id/button8"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:onClick="btnCurrent_onClick"
            android:text="@string/button8"
            android:textSize="25sp" />

        <Button
            android:id="@+id/button9"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:onClick="btnCurrent_onClick"
            android:text="@string/button9"
            android:textSize="25sp" />

        <Button
            android:id="@+id/buttonDiv"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_margin="5dp"
            android:background="#FFBF00"
            android:onClick="btnCurrent_onClick"
            android:text="@string/buttonDiv"
            android:textSize="25sp" />

        <Button
            android:id="@+id/buttonClear"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_margin="5dp"
            android:background="#FF4000"
            android:onClick="btnCurrent_onClick"
            android:text="@string/buttonClear"
            android:textSize="25sp" />
    </TableRow>

    <TableRow
        android:id="@+id/row2"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="2">

        <Button
            android:id="@+id/button4"
            android:layout_width="match_parent"
            android:layout_height="match_parent"

            android:onClick="btnCurrent_onClick"
            android:text="@string/button4"
            android:textSize="25sp" />

        <Button
            android:id="@+id/button5"
            android:layout_width="match_parent"
            android:layout_height="match_parent"

            android:onClick="btnCurrent_onClick"
            android:text="@string/button5"
            android:textSize="25sp" />


        <Button
            android:id="@+id/button6"
            android:layout_width="match_parent"
            android:layout_height="match_parent"

            android:onClick="btnCurrent_onClick"
            android:text="@string/button6"
            android:textSize="25sp" />

        <Button
            android:id="@+id/buttonMulti"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_margin="5dp"

            android:background="#FFBF00"
            android:onClick="btnCurrent_onClick"
            android:text="@string/buttonMulti"
            android:textSize="25sp" />

        <Button
            android:id="@+id/buttonBS"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_margin="5dp"

            android:background="#00ffff"
            android:onClick="btnCurrent_onClick"
            android:text="@string/buttonBS"
            android:textSize="25sp" />
    </TableRow>

    <TableRow
        android:id="@+id/row3"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="2">

        <Button
            android:id="@+id/button1"
            android:layout_width="match_parent"
            android:layout_height="match_parent"

            android:onClick="btnCurrent_onClick"
            android:text="@string/button1"
            android:textSize="25sp" />

        <Button
            android:id="@+id/button2"
            android:layout_width="match_parent"
            android:layout_height="match_parent"

            android:onClick="btnCurrent_onClick"
            android:text="@string/button2"
            android:textSize="25sp" />


        <Button
            android:id="@+id/button3"
            android:layout_width="match_parent"
            android:layout_height="match_parent"

            android:onClick="btnCurrent_onClick"
            android:text="@string/button3"
            android:textSize="25sp" />

        <Button
            android:id="@+id/buttonPlus"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_margin="5dp"
            android:background="#FFBF00"
            android:onClick="btnCurrent_onClick"
            android:text="@string/buttonPlus"
            android:textSize="25sp" />


        <Button
            android:id="@+id/buttonMinus"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_margin="5dp"

            android:background="#FFBF00"
            android:onClick="btnCurrent_onClick"
            android:text="@string/buttonMinus"
            android:textSize="40sp" />
    </TableRow>


    <TableRow
        android:id="@+id/row4"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1">

        <Button
            android:id="@+id/button0"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_span="2"
            android:onClick="btnCurrent_onClick"
            android:text="@string/button0"
            android:textSize="25sp" />

        <Button
            android:id="@+id/buttonPoint"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:onClick="btnCurrent_onClick"
            android:text="@string/buttonPoint"
            android:textSize="40sp" />

        <Button
            android:id="@+id/buttonEqual"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_margin="5dp"
            android:layout_span="2"
            android:background="#2EFE64"
            android:onClick="btnCurrent_onClick"
            android:text="@string/buttonEqual"
            android:textSize="25sp" />
    </TableRow>

string.xml


<resources>
    <string name="app_name">Caluculator</string>
    <string name="button0">0</string>
    <string name="button1">1</string>
    <string name="button2">2</string>
    <string name="button3">3</string>
    <string name="button4">4</string>
    <string name="button5">5</string>
    <string name="button6">6</string>
    <string name="button7">7</string>
    <string name="button8">8</string>
    <string name="button9">9</string>
    <string name="buttonPlus">+</string>
    <string name="buttonMinus">-</string>
    <string name="buttonMulti">×</string>
    <string name="buttonDiv">÷</string>
    <string name="buttonPoint">.</string>
    <string name="buttonEqual">=</string>
    <string name="buttonClear">C</string>
    <string name="buttonBS">BS</string>
</resources>

Recommended Posts

J'ai créé une application de calculatrice sur Android
J'ai créé une application correspondante (application Android)
[Android] J'ai créé une application de podomètre.
J'ai créé une application Janken avec Android
J'ai créé une application de chat.
J'ai créé une bibliothèque pour afficher des tutoriels sur Android.
J'ai créé une application shopify @java
J'ai créé une application Janken avec kotlin
J'ai créé une application Android pour le service MiRm
J'ai créé une application de visualisation qui affiche le PDF
J'ai fait un portfolio avec Ruby On Rails
Développement d'applications ROS sur Android
J'ai fait un chat de dessin "chat de peinture 8 bits" avec WebAssembly
J'ai créé un schéma de verrouillage à l'aide de la touche de volume avec l'application Android. Édition fragmentée
J'ai essayé d'ajouter une ligne de séparation à TabLayout sur Android
J'ai créé une interface graphique avec Swing
Remarques sur l'appel du programme d'installation sur l'application Android
J'ai créé un outil de génération package.xml.
[Rails] J'ai créé une mini-application de calendrier simple avec des spécifications personnalisées.
J'ai essayé de créer une application cartographique simple dans Android Studio
J'ai récemment créé une application js dans le langage courant de Dart
[Ruby] J'ai créé un simple client Ping
Essayez de déployer l'application Rails sur EC2-Part 1-
J'ai fait une mort risquée avec Ruby
J'ai créé un plug-in pour IntelliJ IDEA
Créons une application de calcul avec Java
Déployer des applications Web Java sur Heroku
J'ai créé un nouvel outil de déploiement Java
J'ai une question sur le studio Android.
Permet la lecture automatique de Youtube même avec l'application Android de Cordova
J'ai créé un site qui résume les informations sur la restriction du sucre avec Vue.js
J'ai créé un outil Diff pour les fichiers Java
J'ai créé un programme de jugement des nombres premiers en Java
[Stajun a également admis] Je veux un spiser gastronomique, mais il coûte 1103,3543 billions de yens, j'ai donc créé une application Android
J'ai créé StringUtils.isBlank
04. J'ai fait un frontal avec SpringBoot + Thymeleaf
J'ai fait de l'art de la mosaïque avec des images Pokemon
J'ai créé une application par moi-même! (Application de gestion de la lecture)
Publiez l'application avec ruby on rails
J'ai créé un jeu Janken en Java (CLI)
J'ai essayé de créer une application de clonage LINE
J'ai créé un conteneur Docker pour exécuter Maven
J'ai créé une bibliothèque d'extension Ruby en C
Trébucher avec Android DataBinding + Kotlin (plus BindingAdapter)
[Rails] J'ai créé une fonction de brouillon en utilisant enum
Android: j'ai eu du mal à afficher le fichier HTML sur la carte SD
J'ai créé une bibliothèque de graphiques simple pour les applications de smartphone [MP Android Chart Kai]
J'ai créé un robot LINE avec Rails + heroku
J'ai essayé d'exécuter Java dans un terminal Mac
Comme je l'utilise souvent, je note les choses liées à DB sur Android.
J'ai essayé de déployer une page créée avec l'antique Middleman sur Azure Static Web Apps
J'ai une question. Une erreur se produit lors de la lecture d'une vidéo dans Listview avec Android.
J'ai créé une image Docker pour la version japonaise de SDAPS
J'ai essayé d'utiliser une connexion à une base de données dans le développement Android
J'ai fait un jeu de problèmes de calcul simple en Java