Es ist eine einfache Taschenrechner-App. Ich habe es für das Studium von Android gemacht.
Android Studio 3.6.2 TableLayout
・ Bilder nur unter bestimmten Bedingungen anzeigen Geändert, um das Bild in imageView mit setImageResource festzulegen.
・ Verarbeitung, die Multiplikation und Division priorisiert Speichern Sie die Berechnungsformel in ArrayList → Suchen Sie nach × ÷ und führen Sie eine Prioritätsberechnung durch → Löschen Sie den berechneten Teil aus der Liste → Fügen Sie das Berechnungsergebnis zur Liste hinzu → Wiederholen Sie diesen Vorgang, bis × ÷ verschwindet → Führen Sie dann eine + -Berechnung durch Ich habe es so implementiert.
・ Verlieren Sie den Berechnungsfehler von double Das Problem "1.0d --0.9d = 0.099999999 ..." wird angezeigt. Ich habe es mit der BigDecimal-Klasse gelöst.
・ Ein Fehler tritt auf, wenn die Teilung nicht teilbar ist. In BigDecimal tritt ArithmeticException auf, wenn eine Zahl angezeigt wird, die nicht durch Division (Kreisbruch) teilbar ist. Um diesen Fehler zu vermeiden, wird die Zahl mit der 11. Dezimalstelle abgerundet. Wenn Sie dies jedoch tun, tritt das Problem auf, dass die Zahl, selbst wenn sie teilbar ist, bis zur 10. Ziffer angezeigt wird. Es wird so sein → 4/2 = 2.0000000000 Um dies zu vermeiden, wird die Division in try-catch eingeschlossen und die Zahl an der 11. Stelle wird nur abgerundet, wenn eine ArithmeticException auftritt.
· Bug-Fix Vermeiden Sie die Eingabe mehrerer Dezimalstellen. Drücken Sie nicht + - × ÷ = an einer unbeabsichtigten Stelle. = Verschiedene Verhaltensweisen nach dem Klicken auf die Schaltfläche. Es gab viele andere Dinge ...
Schmales lineares Layout innerhalb der Tabellenzeile.
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>
<!--Knopf über Linien-->
<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>
Ich habe viel gelernt, weil ich es nicht verstehen konnte, bis ich es geschafft habe. Ich werde im Zyklus des Lesens eines Buches weiter lernen → versuchen, es zu machen.
Der Reflexionspunkt ist, dass es voll von if-Sätzen ist. Ich möchte saubereren Code schreiben.
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 zum Speichern von Eingabezeichen
int decimalPointCount = 0; //Eine Variable, die ein kontinuierliches Klicken auf die Dezimalpunktschaltfläche verhindert.
int ClickedFormulaOnce = 0; // +-/*Zur Bestimmung, ob auch nur eine in der Berechnungsformel enthalten ist.+-*/Weil es nicht ohne eins berechnet werden kann.
int formulaContinuousClick = 0; // +-/*Eine Variable, die ein kontinuierliches Klicken auf die Schaltfläche verhindert.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
//Rechenmethode
public void calculation(TextView txt) {
//Holen Sie sich alle Zeichen in TextView und speichern Sie sie in einem Array.
String txtAll = txt.getText().toString();
//Ein regulärer Ausdruck, der auch das Trennzeichen selbst im Array enthält
//Reguläre Ausdrücke((?<=[+×÷-])|(?=[+×÷-]))Die Bedeutung von+-Es bedeutet, unmittelbar vor und nach × ÷ zu trennen.
String[] stringArray = txtAll.split("((?<=[+×÷-])|(?=[+×÷-]))", 0);
//Löschen Sie nach dem Speichern im Array alle Zeichen in TextView.
txt.setText(null);
//Speichern Sie alle Arrays in ArrayList.
for(String s:stringArray) {
stringList.add(s);
}
//Im Gegensatz zu double hat Big Decimal keinen Fehler.
BigDecimal bigDecimalResultValue = new BigDecimal("0.0");
//Multiplikations- und Divisionsverarbeitung
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)));
//Entfernen Sie die berechneten Zahlen und Ausdrücke aus der Zeichenfolgenliste. Beispiel: "2*3+"2" von "1"*Löschen Sie den Teil von "3".
stringList.remove(i-1);
stringList.remove(i-1);
stringList.remove(i-1);
//Fügen Sie das Berechnungsergebnis zu stringList hinzu. Beispiel: "2*3+1 bis 6+Auf 1 "einstellen.
stringList.add(i-1, String.valueOf(bigDecimalResultValue));
//Ich habe 3 stringLists gelöscht und 1 hinzugefügt, also subtrahiere 2 von i.
i -= 2;
} else if (stringList.get(i).equals("÷")) {
//Wenn die Bigdecimal-Division eine unteilbare Zahl ist, tritt ein ArithmeticException-Fehler auf. Schließen Sie es daher in trycath ein.
//Wenn dies endgültig teilbar ist, wird 00000 nach dem Dezimalpunkt nicht verschwendet.
//Runden Sie die 11. Stelle nur ab, wenn sie nicht teilbar ist.
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);//Gerundet. Anzeige bis zur 10. Ziffer.
}
stringList.remove(i-1);
stringList.remove(i-1);
stringList.remove(i-1);
stringList.add(i-1, String.valueOf(bigDecimalResultValue));
i -= 2;
}
}
//Additions- und Subtraktionsverarbeitung
//Multiplikation und Division wurden bereits verarbeitet, also einfach von vorne addieren und subtrahieren.
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")) {
//Verarbeitung, um das Bild nur anzuzeigen, wenn das Ergebnis 3 ist
//Holen Sie sich das ImageView-Objekt basierend auf der ID
@SuppressLint("ResourceType")
ImageView iv = this.findViewById(R.id.imageView);
//Legen Sie das Bild im Zeichenordner fest
iv.setImageResource(R.drawable.nabeatsu);
txt.setText("Weltpfannen");
} else {
txt.setText(String.valueOf(bigDecimalResultValue));
}
//Löschen Sie die Liste, nachdem Sie die Ergebnisse angezeigt haben.
stringList.clear();
}
public void btnCurrent_onClick(View view) {
//Textansicht abrufen
TextView txt = findViewById(R.id.textView);
//Beurteilen Sie die Schaltfläche, auf die die switch-Anweisung geklickt hat. Anzeige im Text.
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;
//Bearbeitbare Instanz abrufen
Editable editable = Editable.Factory.getInstance().newEditable(txt.getText());
//Verarbeitung zum Löschen des letzten Zeichens bei jedem Drücken der Taste
if(editable.length() > 0){
//Das erste Argument für "Löschen" ist der Beginn des Zeichens, das Sie löschen möchten,Das zweite Argument ist das Ende des Zeichens, das Sie löschen möchten
editable.delete(editable.length()-1, editable.length());
}
//In TextView einstellen
txt.setText(editable, TextView.BufferType.EDITABLE);
break;
case R.id.buttonClear:
decimalPointCount = 0;
ClickedFormulaOnce = 0;
formulaContinuousClick = 0;
stringList.clear();
//Zum Löschen von Bildern
@SuppressLint("ResourceType")
ImageView iv = this.findViewById(R.id.imageView);
iv.setImageDrawable(null);
txt.setText(null);
break;
case R.id.buttonPoint:
//Beurteilung, die wiederholte Treffer des Dezimalpunkts verhindert.
if (decimalPointCount == 0) {
txt.append(".");
decimalPointCount = 1;
}
break;
//Von hier+-/*Was passiert, wenn Sie auf klicken?
//formulaContinuousClick+-*/=Zur Verhinderung kontinuierlicher Klicks.
//Einmal auf Formel geklickt+-*/Um festzustellen, ob Sie einmal geklickt haben.
case R.id.buttonPlus:
formulaContinuousClick++;
// +-/*Verarbeitung beim Drücken. Ignorieren Sie für kontinuierliche Taps.
//Wenn TextView nichts enthält, wird es ignoriert.
if(formulaContinuousClick == 1 && !(txt.getText().toString().equals(""))) {
ClickedFormulaOnce = 1;
txt.append("+");
}
decimalPointCount = 0; //Gibt die Klickzahl des Dezimalpunkts auf 0 zurück.
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;
//Verhindert, dass weitere Dezimalstellen hinzugefügt werden, wenn das Berechnungsergebnis eine Dezimalstelle enthält. Beispiel "3.3+0.1=3.4 → Klicken Sie auf den Dezimalpunkt → "3".4."Eine solche
decimalPointCount = 1;
if(txt.getText().toString().length() > 56) {
Context context = getApplicationContext();
Toast.makeText(context, "Die Anzahl der Zeichen überschreitet die Obergrenze von 56 Zeichen.", 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