我试图让操作员在切换方向时进行更改。
例如,如果用户点击9
后跟X
(代表相乘),然后更改方向,则后跟3
和=
。我希望它显示18
,但我得到0
。
这是我的MainActivity
:
public class MainActivity extends Activity implements View.OnClickListener{
private static String TAG = "MainActivity";
private EditText mCalculatorDisplay;
private Boolean userIsInTheMiddleOfTypingANumber = false;
private CalculatorBrain mCalculatorBrain;
private static final String DIGITS = "0123456789.";
DecimalFormat df = new DecimalFormat("@###########");
@Override
protected void onCreate(Bundle savedInstanceState) {
if (BuildConfig.DEBUG) { Log.d(TAG, "onCreate called");}
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mCalculatorBrain = new CalculatorBrain();
mCalculatorDisplay = (EditText) findViewById(R.id.display);
df.setMinimumFractionDigits(0);
df.setMinimumIntegerDigits(1);
df.setMaximumIntegerDigits(8);
findViewById(R.id.Button_Zero).setOnClickListener(this);
findViewById(R.id.Button_One).setOnClickListener(this);
findViewById(R.id.Button_Two).setOnClickListener(this);
findViewById(R.id.Button_Three).setOnClickListener(this);
findViewById(R.id.Button_Four).setOnClickListener(this);
findViewById(R.id.Button_Five).setOnClickListener(this);
findViewById(R.id.Button_Six).setOnClickListener(this);
findViewById(R.id.Button_Seven).setOnClickListener(this);
findViewById(R.id.Button_Eight).setOnClickListener(this);
findViewById(R.id.Button_Nine).setOnClickListener(this);
findViewById(R.id.Button_Add).setOnClickListener(this);
findViewById(R.id.Button_Substract).setOnClickListener(this);
findViewById(R.id.Button_Multiply).setOnClickListener(this);
findViewById(R.id.Button_Divide).setOnClickListener(this);
findViewById(R.id.Button_Dot).setOnClickListener(this);
findViewById(R.id.Button_Sum).setOnClickListener(this);
findViewById(R.id.Button_Clear).setOnClickListener(this);
findViewById(R.id.Button_MemoryRecall).setOnClickListener(this);
findViewById(R.id.Button_MemoryAdd).setOnClickListener(this);
findViewById(R.id.Button_MemoryClear).setOnClickListener(this);
// The following buttons only exist in layout-land (Landscape mode) and require extra attention.
// The messier option is to place the buttons in the regular layout too and set android:visibility="invisible".
if (findViewById(R.id.Button_SquareRoot) != null) {
findViewById(R.id.Button_SquareRoot).setOnClickListener(this);
}
if (findViewById(R.id.Button_Squared) != null) {
findViewById(R.id.Button_Squared).setOnClickListener(this);
}
if (findViewById(R.id.Button_Invert) != null) {
findViewById(R.id.Button_Invert).setOnClickListener(this);
}
if (findViewById(R.id.Button_Sin) != null) {
findViewById(R.id.Button_Sin).setOnClickListener(this);
}
if (findViewById(R.id.Button_Cos) != null) {
findViewById(R.id.Button_Cos).setOnClickListener(this);
}
if (findViewById(R.id.Button_Tan) != null) {
findViewById(R.id.Button_Tan).setOnClickListener(this);
}
if(findViewById(R.id.Button_Toggle) != null){
findViewById(R.id.Button_Toggle).setOnClickListener(this);
}
}
@Override
public void onClick(View v) {
String buttonPressed = ((Button) v).getText().toString();
if (DIGITS.contains(buttonPressed)) {
// digit was pressed
if (userIsInTheMiddleOfTypingANumber) {
if (buttonPressed.equals(".") && mCalculatorDisplay.getText().toString().contains(".")) {
// ERROR PREVENTION
// Eliminate entering multiple decimals
} else {
mCalculatorDisplay.append(buttonPressed);
}
} else {
if (buttonPressed.equals(".")) {
// ERROR PREVENTION
// This will avoid error if only the decimal is hit before an operator, by placing a leading zero
// before the decimal
mCalculatorDisplay.setText(0 + buttonPressed);
} else {
mCalculatorDisplay.setText(buttonPressed);
}
userIsInTheMiddleOfTypingANumber = true;
}
} else {
// operation was pressed
if (BuildConfig.DEBUG) { Log.d(TAG, "operation pressed");}
if (userIsInTheMiddleOfTypingANumber) {
mCalculatorBrain.setOperand(Double.parseDouble(mCalculatorDisplay.getText().toString()));
userIsInTheMiddleOfTypingANumber = false;
}
mCalculatorBrain.performOperation(buttonPressed);
mCalculatorDisplay.setText(df.format(mCalculatorBrain.getResult()));
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
// Save variables on screen orientation change
outState.putDouble("OPERAND", mCalculatorBrain.getResult());
outState.putDouble("MEMORY", mCalculatorBrain.getMemory());
if (BuildConfig.DEBUG) { Log.d(TAG, "onSaveInstanceState called");}
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
// Restore variables on screen orientation change
mCalculatorBrain.setOperand(savedInstanceState.getDouble("OPERAND"));
mCalculatorBrain.setMemory(savedInstanceState.getDouble("MEMORY"));
mCalculatorDisplay.setText(df.format(mCalculatorBrain.getResult()));
if (BuildConfig.DEBUG) { Log.d(TAG, "onRestoreInstanceState called");}
}
}
这是我的CalculatorBrain
:
public class CalculatorBrain {
// 3 + 6 = 9
// 3 & 6 are called the operand.
// The + is called the operator.
private static String TAG = "CalculatorBrain";
// 9 is the result of the operation.
private double mOperand;
private double mWaitingOperand;
private String mWaitingOperator;
private double mCalculatorMemory;
// operator types
public static final String ADD = "+";
public static final String SUBTRACT = "-";
public static final String MULTIPLY = "x";
public static final String DIVIDE = "÷";
public static final String CLEAR = "DEL" ;
public static final String CLEARMEMORY = "MC";
public static final String ADDTOMEMORY = "M+";
public static final String RECALLMEMORY = "MR";
public static final String SQUAREROOT = "√";
public static final String SQUARED = "x²";
public static final String INVERT = "1/x";
public static final String TOGGLESIGN = "+/-";
public static final String SINE = "sin";
public static final String COSINE = "cos";
public static final String TANGENT = "tan";
// public static final String EQUALS = "=";
// constructor
public CalculatorBrain() {
// initialize variables upon start
mOperand = 0;
mWaitingOperand = 0;
mWaitingOperator = "";
mCalculatorMemory = 0;
}
public void setOperand(double operand) {
if(BuildConfig.DEBUG){Log.d(TAG, "setoperand value" + Double.toString(operand));}
mOperand = operand;
if (BuildConfig.DEBUG) { Log.d(TAG, "setOperand called");}
}
public double getResult() {
if (BuildConfig.DEBUG) { Log.d(TAG, "getResult called");}
return mOperand;
}
// used on screen orientation change
public void setMemory(double calculatorMemory) {
if (BuildConfig.DEBUG) { Log.d(TAG, "setMemory called");}
mCalculatorMemory = calculatorMemory;
}
// used on screen orientation change
public double getMemory() {
if (BuildConfig.DEBUG) { Log.d(TAG, "getMemory called");}return mCalculatorMemory;
}
public String toString() {
return Double.toString(mOperand);
}
protected double performOperation(String operator) {
switch (operator) {
case CLEAR:
mOperand = 0;
mWaitingOperator = "";
mWaitingOperand = 0;
break;
case CLEARMEMORY:
mCalculatorMemory = 0;
break;
case ADDTOMEMORY:
mCalculatorMemory = mCalculatorMemory + mOperand;
break;
case RECALLMEMORY:
`enter code here` mOperand = mCalculatorMemory;
break;
case SQUAREROOT:
mOperand = Math.sqrt(mOperand);
break;
case SQUARED:
mOperand = mOperand * mOperand;
break;
case INVERT:
if (mOperand != 0) {
mOperand = 1 / mOperand;
} else {
mOperand = 0;
}
break;
case TOGGLESIGN:
mOperand = -mOperand;
break;
case SINE:
mOperand = Math.sin(Math.toRadians(mOperand));
break;
case COSINE:
mOperand = Math.cos(Math.toRadians(mOperand));
break;
case TANGENT:
mOperand = Math.tan(Math.toRadians(mOperand));
break;
default:
performWaitingOperation();
mWaitingOperand = mOperand;
mWaitingOperator = operator;
break;
}
return mOperand;
}
protected void performWaitingOperation() {
if (BuildConfig.DEBUG) { Log.d(TAG, "performWaitingOperation called");}
switch (mWaitingOperator){
case ADD:
mOperand = mWaitingOperand + mOperand;
break;
case MULTIPLY:
mOperand = mWaitingOperand * mOperand;
break;
case SUBTRACT:
mOperand = mWaitingOperand - mOperand;
break;
case DIVIDE:
mOperand = mWaitingOperand / mOperand;
break;
}
}
}
提前致谢!
答案 0 :(得分:0)
使用以下
更改方法onSaveInstanceState super.onSaveInstanceState(outState);
应该在最后一次调用
@Override
protected void onSaveInstanceState(Bundle outState) {
// Save variables on screen orientation change
outState.putDouble("OPERAND", mCalculatorBrain.getResult());
outState.putDouble("MEMORY", mCalculatorBrain.getMemory());
if (BuildConfig.DEBUG) { Log.d(TAG, "onSaveInstanceState called");}
super.onSaveInstanceState(outState);
}
答案 1 :(得分:0)
这种情况正在发生,因为当您的活动更改其方向时它会重新启动。在清单文件中添加此内容
android:configChanges="orientation|screenSize|keyboardHidden"
这将阻止它重新启动。