我正在開發適用於android的計算器應用程序,並有新手用戶,面臨小問題。 我想實現如下: 當用戶點擊2 + 3 = 5 當再次用戶點擊=只簽署,它應該顯示8(即5 + 3 = 8) 目前我在按照以下進場做我的工作:(+, - 等)如何在android中以遞歸方式添加,減去,除或乘以計算器中的數字?
private TextView txtCalc=null;
private double num = 0;
num = num + Double.parseDouble(txtCalc.getText().toString());
String txt = Double.toString(num);
txtCalc.setText(txt);
然後根據操作員通過用戶輸入,它執行的數學運算。
有什麼建議嗎?如果任何人都可以提供,代碼片段會非常有幫助。 對於@Sandy:這裏是我的完整代碼:
public class Calculator extends Activity {
private final String SDK_VERSION = "1";
private final int MENUITEM_CLOSE = 300;
/*
* Edit Text and Button object initialization for simple
* calculator design.
*/
private TextView txtCalc=null;
private Button btnZero=null;
private Button btnOne=null;
private Button btnTwo=null;
private Button btnThree=null;
private Button btnFour=null;
private Button btnFive=null;
private Button btnSix=null;
private Button btnSeven=null;
private Button btnEight=null;
private Button btnNine=null;
private Button btnPlus=null;
private Button btnMinus=null;
private Button btnMultiply=null;
private Button btnDivide=null;
private Button btnEquals=null;
private Button btnAC=null;
private Button btnDecimal=null;
private Button btnPT=null;
private Button btnMR=null;
private Button btnMM=null;
private Button btnMP=null;
private Button btnCE=null;
private Button btnPerc=null;
private Button btnSqrRoot=null;
private Button btnGT=null;
private double num = 0;
private double memNum = 0;
private int operator = 1;
// 0 = nothing, 1 = plus, 2 = minus, 3 =
// multiply, 4 = divide
private boolean readyToClear = false;
private boolean hasChanged = false;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setTheme(android.R.style.Theme_Black);
setContentView(R.layout.calculator);
this.setTitle("Dual Memory Calculator");
initControls();
initScreenLayout();
reset();
}
private void initScreenLayout() {
/*
* The following three command lines you can use depending
* upon the emulator device you are using.
*/
// 320 x 480 (Tall Display - HVGA-P) [default]
// 320 x 240 (Short Display - QVGA-L)
// 240 x 320 (Short Display - QVGA-P)
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
// this.showAlert(dm.widthPixels +" "+ dm.heightPixels, dm.widthPixels
// +" "+ dm.heightPixels, dm.widthPixels +" "+ dm.heightPixels, false);
int height = dm.heightPixels;
int width = dm.widthPixels;
if (height < 400 || width < 300) {
txtCalc.setTextSize(20);
}
if (width < 300) {
/*btnPT.setTextSize(18);
btnMR.setTextSize(18);
btnMP.setTextSize(18);
btnMM.setTextSize(18);
btnCE.setTextSize(18);
btnDivide.setTextSize(18);
btnPlus.setTextSize(18);
btnMinus.setTextSize(18);
btnMultiply.setTextSize(18);
btnEquals.setTextSize(18);
btnGT.setTextSize(18);
btnPerc.setTextSize(18);
btnAC.setTextSize(18);
btnSqrRoot.setTextSize(18);
btnNine.setTextSize(18);
btnEight.setTextSize(18);
btnSeven.setTextSize(18);
btnSix.setTextSize(18);
btnFive.setTextSize(18);
btnFour.setTextSize(18);
btnThree.setTextSize(18);
btnTwo.setTextSize(18);
btnOne.setTextSize(18);
btnZero.setTextSize(18);
btnDecimal.setTextSize(18);*/
}
btnZero.setTextColor(Color.BLACK);
btnOne.setTextColor(Color.BLACK);
btnTwo.setTextColor(Color.BLACK);
btnThree.setTextColor(Color.BLACK);
btnFour.setTextColor(Color.BLACK);
btnFive.setTextColor(Color.BLACK);
btnSix.setTextColor(Color.BLACK);
btnSeven.setTextColor(Color.BLACK);
btnEight.setTextColor(Color.BLACK);
btnNine.setTextColor(Color.BLACK);
btnGT.setTextColor(Color.BLACK);
btnDecimal.setTextColor(Color.BLACK);
btnMP.setTextColor(Color.BLACK);
btnMM.setTextColor(Color.BLACK);
btnMR.setTextColor(Color.BLACK);
btnPT.setTextColor(Color.BLACK);
btnCE.setTextColor(Color.RED);
btnAC.setTextColor(Color.BLACK);
btnPerc.setTextColor(Color.BLACK);
btnSqrRoot.setTextColor(Color.BLACK);
}
private void initControls() {
txtCalc = (TextView) findViewById(R.id.txtCalc);
btnZero = (Button) findViewById(R.id.btnZero);
btnOne = (Button) findViewById(R.id.btnOne);
btnTwo = (Button) findViewById(R.id.btnTwo);
btnThree = (Button) findViewById(R.id.btnThree);
btnFour = (Button) findViewById(R.id.btnFour);
btnFive = (Button) findViewById(R.id.btnFive);
btnSix = (Button) findViewById(R.id.btnSix);
btnSeven = (Button) findViewById(R.id.btnSeven);
btnEight = (Button) findViewById(R.id.btnEight);
btnNine = (Button) findViewById(R.id.btnNine);
btnPlus = (Button) findViewById(R.id.btnPlus);
btnMinus = (Button) findViewById(R.id.btnMinus);
btnMultiply = (Button) findViewById(R.id.btnMultiply);
btnDivide = (Button) findViewById(R.id.btnDivide);
btnEquals = (Button) findViewById(R.id.btnEquals);
btnAC = (Button) findViewById(R.id.btnAC);
btnDecimal = (Button) findViewById(R.id.btnDecimal);
btnPT = (Button) findViewById(R.id.btnPT);
btnMR = (Button) findViewById(R.id.btnMR);
btnMM = (Button) findViewById(R.id.btnMM);
btnMP = (Button) findViewById(R.id.btnMP);
btnCE = (Button) findViewById(R.id.btnCE);
btnPerc = (Button) findViewById(R.id.btnPerc);
btnSqrRoot = (Button) findViewById(R.id.btnSqrRoot);
btnGT = (Button) findViewById(R.id.btnGT);
//txtCalc.setOnKeyListener(new On)
btnZero.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
handleNumber(0);
}
});
btnOne.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
handleNumber(1);
}
});
btnTwo.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
handleNumber(2);
}
});
btnThree.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
handleNumber(3);
}
});
btnFour.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
handleNumber(4);
}
});
btnFive.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
handleNumber(5);
}
});
btnSix.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
handleNumber(6);
}
});
btnSeven.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
handleNumber(7);
}
});
btnEight.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
handleNumber(8);
}
});
btnNine.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
handleNumber(9);
}
});
btnPlus.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
handleEquals(1);
}
});
btnMinus.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
handleEquals(2);
}
});
btnMultiply.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
handleEquals(3);
}
});
btnDivide.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
handleEquals(4);
}
});
btnEquals.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
/*String tempNum = txtCalc.getText().toString().trim();
Double tempDoubleNum = Double.valueOf(tempNum);
//num = tempDoubleNum + num;
if(!hasChanged){
if(txtCalc.getText().toString() != ""){
switch(operator){
case 0:
handleEquals(0);
break;
case 1:
num = tempDoubleNum + Double.parseDouble(txtCalc.getText().toString());
handleEquals(1);
break;
case 2:
num = tempDoubleNum - Double.parseDouble(txtCalc.getText().toString());
handleEquals(2);
break;
case 3:
num = tempDoubleNum * Double.parseDouble(txtCalc.getText().toString());
handleEquals(3);
break;
case 4:
num = tempDoubleNum/Double.parseDouble(txtCalc.getText().toString());
handleEquals(4);
break;
}
}
} */
handleEquals(0);
}
});
btnAC.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
reset();
}
});
btnDecimal.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
handleDecimal();
}
});
btnGT.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
handlePlusMinus();
}
});
btnPT.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
memNum = 0;
}
});
btnMR.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
setValue(Double.toString(memNum));
}
});
btnMM.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
memNum = memNum
- Double.parseDouble(txtCalc.getText().toString());
operator = 0;
}
});
btnMP.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
memNum = memNum
+ Double.parseDouble(txtCalc.getText().toString());
operator = 0;
}
});
btnCE.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
handleBackspace();
}
});
btnSqrRoot.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
setValue(Double.toString(Math.sqrt(Double.parseDouble(txtCalc
.getText().toString()))));
}
});
btnPerc.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
setValue(Double.toString(num
* (0.01 * Double.parseDouble(txtCalc.getText()
.toString()))));
}
});
txtCalc.setOnKeyListener(new OnKeyListener() {
public boolean onKey(View v, int i, android.view.KeyEvent e) {
if (e.getAction() == KeyEvent.ACTION_DOWN) {
int keyCode = e.getKeyCode();
// txtCalc.append("["+Integer.toString(keyCode)+"]");
switch (keyCode) {
case KeyEvent.KEYCODE_0:
handleNumber(0);
break;
case KeyEvent.KEYCODE_1:
handleNumber(1);
break;
case KeyEvent.KEYCODE_2:
handleNumber(2);
break;
case KeyEvent.KEYCODE_3:
handleNumber(3);
break;
case KeyEvent.KEYCODE_4:
handleNumber(4);
break;
case KeyEvent.KEYCODE_5:
handleNumber(5);
break;
case KeyEvent.KEYCODE_6:
handleNumber(6);
break;
case KeyEvent.KEYCODE_7:
handleNumber(7);
break;
case KeyEvent.KEYCODE_8:
handleNumber(8);
break;
case KeyEvent.KEYCODE_9:
handleNumber(9);
break;
case 43:
handleEquals(1);
break;
case KeyEvent.KEYCODE_EQUALS:
hasChanged = false;
if(!hasChanged && txtCalc.getText().toString()!= ""){
String strNum = txtCalc.getText().toString();
Double tmpNum = Double.valueOf(strNum);
handleEquals(keyCode);
}
handleEquals(0);
break;
case KeyEvent.KEYCODE_MINUS:
handleEquals(2);
break;
case KeyEvent.KEYCODE_PERIOD:
handleDecimal();
break;
case KeyEvent.KEYCODE_C:
reset();
break;
case KeyEvent.KEYCODE_SLASH:
handleEquals(4);
break;
case KeyEvent.KEYCODE_DPAD_DOWN:
return false;
}
}
return true;
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(0,1, MENUITEM_CLOSE, "Close");
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case MENUITEM_CLOSE:
finish();
break;
}
return super.onOptionsItemSelected(item);
}
public static double round(double unrounded, int precision, int roundingMode)
{
BigDecimal bd = new BigDecimal(unrounded);
BigDecimal rounded = bd.setScale(precision, roundingMode);
return rounded.doubleValue();
}
private void handleEquals(int newOperator) {
if (hasChanged) {
switch (operator) {
case 1:
num = num + Double.parseDouble(txtCalc.getText().toString());
break;
case 2:
num = num - Double.parseDouble(txtCalc.getText().toString());
break;
case 3:
num = num * Double.parseDouble(txtCalc.getText().toString());
String strNum = null;
strNum = Double.toString(num);
if(strNum.contains("E")){
strNum = strNum.substring(0, 6) + strNum.substring(strNum.indexOf("E"));
}
Log.i("MULTIPLICATION","Checking Precision");
System.out.println("New StrNum is: " + strNum);
num = Double.valueOf(strNum);
break;
case 4:
num = num/Double.parseDouble(txtCalc.getText().toString());
break;
}
String txt = Double.toString(num);
txtCalc.setText(txt);
//txtCalc.setSelection(txt.length());
readyToClear = true;
hasChanged = false;
}
operator = newOperator;
}
private void handleNumber(int num) {
if (operator == 0)
reset();
String txt = txtCalc.getText().toString();
if (readyToClear) {
txt = "";
readyToClear = false;
} else if (txt.equals("0"))
txt = "";
txt = txt + Integer.toString(num);
txtCalc.setText(txt);
//txtCalc.setSelection(txt.length());
hasChanged = true;
}
private void setValue(String value) {
if (operator == 0)
reset();
if (readyToClear) {
readyToClear = false;
}
txtCalc.setText(value);
//txtCalc.setSelection(value.length());
hasChanged = true;
}
private void handleDecimal() {
if (operator == 0)
reset();
if (readyToClear) {
txtCalc.setText("0.");
//txtCalc.setSelection(2);
readyToClear = false;
hasChanged = true;
} else {
String txt = txtCalc.getText().toString();
if (!txt.contains(".")) {
txtCalc.append(".");
hasChanged = true;
}
}
}
private void handleBackspace() {
if (!readyToClear) {
String txt = txtCalc.getText().toString();
if (txt.length() > 0) {
txt = txt.substring(0, txt.length() - 1);
if (txt.equals(""))
txt = "0";
txtCalc.setText(txt);
// txtCalc.setSelection(txt.length());
}
}
}
private void handlePlusMinus() {
if (!readyToClear) {
String txt = txtCalc.getText().toString();
if (!txt.equals("0")) {
if (txt.charAt(0) == '-')
txt = txt.substring(1, txt.length());
else
txt = "-" + txt;
txtCalc.setText(txt);
// txtCalc.setSelection(txt.length());
}
}
}
private void reset() {
num = 0;
txtCalc.setText("0");
//txtCalc.setSelection(1);
operator = 1;
}
}
但是我的數學運算只能使用單個操作數來執行。在這種情況下,它是「num」變量。現在我該如何檢測用戶是否按下了操作員標誌或數字標誌以及多少次? – YuDroid
如何檢測用戶點擊「=」。我已經嘗試 – jainal
這裏其示例代碼:「情況下KeyEvent.KEYCODE_EQUALS:;(!!hasChanged && txtCalc.getText()的toString()= \t \t hasChanged =假 \t \t如果 「」){ \t \t \t 。串strNum = txtCalc.getText()的toString(); \t \t \t雙tmpNum = Double.valueOf(strNum); \t \t \t handleEquals(鍵代碼); \t \t} \t漢dleEquals(0); \t break;「 – YuDroid