2011-08-11 57 views
0

我正在開發適用於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; 
    } 
    } 

回答

0

只要最後的算存儲爲int類型。通過這種方式,您可以使switch選擇必須執行的操作,如上次操作

0

嘗試爲folows

2 + 3 = 5. 
When user hits "=",save 3 in a variable.In this case, 
double tmp = 3; 
whenever user press "=" 
just do the following 
num = num+tmp; 
then show the result. 
when user press another digit/symbol etc. then set tmp = 0; 
+0

但是我的數學運算只能使用單個操作數來執行。在這種情況下,它是「num」變量。現在我該如何檢測用戶是否按下了操作員標誌或數字標誌以及多少次? – YuDroid

+0

如何檢測用戶點擊「=」。我已經嘗試 – jainal

+0

這裏其示例代碼:「情況下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

0

您可以通過下面的代碼檢測 「=」,或者您可以使用其他keylisteners

txtCalc.setOnKeyListener(new OnKeyListener() { 
      @Override 
      public boolean onKey(View v, int keyCode, KeyEvent event) { 

       if (keyCode == 70) { 

        Log.d("My Log"," = entered"); 
        return false; 
       } 
       return false; 
      } 


     }); 

這裏KeyCode 70是 '='

關鍵代碼
+0

感謝您的建議,並通過使用{setOnKeyListeners(...)}獲取鍵碼。但問題是,我將前一個值存儲在一個臨時變量中,然後它也沒有做任何事情。這裏它的示例代碼,我曾嘗試:「案例KeyEvent.KEYCODE_EQUALS: \t \t hasChanged = false; \t \t如果{ \t \t \t字符串strNum = txtCalc.getText()的toString()(hasChanged && txtCalc.getText()的toString()= 「」!!)。 \t \t \t Double tmpNum = Double。的valueOf(strNum); \t \t \t handleEquals(keyCode); \t \t} \t handleEquals(0); \t break;「 – YuDroid

+0

你可以發佈一些代碼嗎? – Sandy

+0

@ Sandy:這是我的完整代碼: – YuDroid

相關問題