C'est une application de calcul simple. Je l'ai fait pour étudier Android.
Android Studio 3.6.2 TableLayout
-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 ...
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>
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.
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