У меня домашнее задание по созданию калькулятора в студии android. Я создал числа и кнопки действий, я поместил числа в переменную, а затем отрендерил их в объект EditText для отображения в шаблоне.
все работает нормально, но когда я установить синтаксический анализ следующим образом 1+1-1
я получаю -1
instand из 1
, это происходит из-за его перезаписи значения lastaction
ehrn я нажимаю противоположную кнопку.
ПРИМЕР ВИДЕО:
https://i.imgur.com/N7m6rA3.mp4
КОД:
package com.example.calculator;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
boolean equalWasPressed = false, showResults = false;
String lastAction, plastAction;
int num1 = Integer.MIN_VALUE, num2 = Integer.MIN_VALUE, temp = Integer.MIN_VALUE; // acting like null
final int ONE = 1, TWO = 2, THREE = 3, FOUR = 4, FIVE = 5, SIX = 6, SEVEN = 7, EIGHT = 8, NINE = 9, ZERO = 0;
final String PLUS = "+", MINUS = "-";
public void renderScreen() {
EditText screenEditText = findViewById(R.id.screen);
String textToShow = "0";
if (temp == Integer.MIN_VALUE && num1 == Integer.MIN_VALUE && num2 == Integer.MIN_VALUE) {
textToShow = "";
} else if (num1 != Integer.MIN_VALUE && showResults) {
textToShow = String.valueOf(num1);
} else {
if (num1 == Integer.MIN_VALUE && lastAction == MINUS) {
textToShow = (temp == Integer.MIN_VALUE) ? "0" : String.valueOf(MINUS + temp);
temp *= -1;
} else if (num1 == Integer.MIN_VALUE) {
textToShow = (temp == Integer.MIN_VALUE) ? "0" : String.valueOf(temp);
} else if (num1 != Integer.MIN_VALUE && temp != Integer.MIN_VALUE) {
textToShow = String.valueOf(num1) + lastAction + String.valueOf(temp);
} else if (num1 != Integer.MIN_VALUE) {
textToShow = String.valueOf(num1) + lastAction;
} else if (num1 != Integer.MIN_VALUE && num2 != Integer.MIN_VALUE) {
textToShow = String.valueOf(num1) + lastAction + String.valueOf(num2);
}
}
screenEditText.setText(textToShow);
}
public void sendValue(int number) {
showResults = false;
if (temp == Integer.MIN_VALUE) {
temp = number;
} else {
temp *= 10;
temp += number;
}
}
public void setAction(String action){
lastAction = action;
}
public void placeTemp() {
Log.i("case","clicked");
if (equalWasPressed) {
if (num1 != Integer.MIN_VALUE && temp != Integer.MIN_VALUE) {
num1 = (lastAction.equals(PLUS)) ? num1 + temp : num1 - temp;
num2 = temp = Integer.MIN_VALUE;
showResults = true;
}
equalWasPressed = false;
} else {
showResults = false;
if (num1 == Integer.MIN_VALUE) {
num1 = temp;
temp = Integer.MIN_VALUE;
} else if (num2 == Integer.MIN_VALUE && temp != Integer.MIN_VALUE) {
if (lastAction.equals(PLUS)) {
num1 += temp;
} else if (lastAction.equals(MINUS)) {
num1 -= temp;
}
temp = Integer.MIN_VALUE;
} else if (num2 == Integer.MIN_VALUE) {
num2 = temp;
temp = Integer.MIN_VALUE;
} else {
if (lastAction.equals(PLUS)) {
num1 += num2;
} else if (lastAction.equals(MINUS)) {
num1 -= num2;
}
num2 = Integer.MIN_VALUE;
temp = Integer.MIN_VALUE;
}
}
}
public void buttonClicked(View v) {
switch (v.getId()) {
case R.id.button1:
sendValue(ONE);
break;
case R.id.button2:
sendValue(TWO);
break;
case R.id.button3:
sendValue(THREE);
break;
case R.id.button4:
sendValue(FOUR);
break;
case R.id.button5:
sendValue(FIVE);
break;
case R.id.button6:
sendValue(SIX);
break;
case R.id.button7:
sendValue(SEVEN);
break;
case R.id.button8:
sendValue(EIGHT);
break;
case R.id.button9:
sendValue(NINE);
break;
case R.id.button0:
sendValue(ZERO);
break;
case R.id.buttonC:
num1 = num2 = temp = Integer.MIN_VALUE; // reset variables
lastAction = PLUS;
break;
case R.id.buttonPlus:
setAction(PLUS);
lastAction = "+";
placeTemp();
break;
case R.id.buttonMinus:
setAction(MINUS);
placeTemp();
break;
case R.id.buttonEqual:
equalWasPressed = true;
placeTemp();
break;
}
renderScreen();
}
}
Я не могу придумать способ исправить это. Надеюсь, ты сможешь мне помочь.