2012-08-13 26 views
0

我是Android開發新手,目前正在學習設計基本的計算器應用程序。我已經自己設計了佈局,但是從不同網站的主要活動代碼獲得了0到9,+, -, *, /的操作,並且在合併之後,它們工作正常。Android計算器:小數點位置的按鈕

但是,我想用小數點函數進一步修改MainActivity。 使用「current = current * 10 + number」可以正確顯示整數,例如53 = 5 * 10 + 3;

我想申請小數點相同的方法用環功能,這個想法是這樣的: 1電流=電流+剩餘如果點的按鈕被按下 2.創建的整數I,I增加1一旦點擊任何數字按鈕 3.以便當例如輸入5.3,i = 1,它將= 5 + 3 /(10^i)= 5.3 4. 5.3循環到這裏,然後當例如,輸入作爲5.39,現在我= 2,它將= 5.3 + 9 /(10^I)= 5.39

問題>> * 但是...真的...我很新鮮,我做不知道如何設計小數點按鈕的編碼,會有人可以提示代碼嗎? *第一忽略以下插件其中待檢測的錯誤(如刪除第二點,如果點是輸入兩次或更多次,在.如果說前面添加0.5是輸入)

按鈕id是如下,並且一旦點擊以引用DecimalClickEvent Button b_decimal =(Button)findViewById(R.id.decimal); b_decimal.setOnClickListener(new DecimalClickEvent(???));}

很多很多很多的提前感謝!代碼附在下面供參考和您的意見:

========================= MainActivity.java ======= ==============================

package com.trial.newcalculator; 

import java.io.Serializable; 
import android.annotation.SuppressLint; 
import android.app.Activity; 
import android.app.AlertDialog; 
import android.content.DialogInterface; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.TextView; 

@SuppressLint("ParserError") 
public class MainActivity extends Activity { 
    State s; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.main); 
     s = new State(); 

     int[] opNumbers = new int[] { 
       R.id.zero, 
       R.id.one, 
       R.id.two, 
       R.id.three, 
       R.id.four, 
       R.id.five, 
       R.id.six, 
       R.id.seven, 
       R.id.eight, 
       R.id.nine,  
     }; 

     final TextView textView = (TextView) findViewById(R.id.ansEditText); 
     for (int i = 0; i < 10;i++){ 
      final Button button = (Button) findViewById(opNumbers[i]);   
      button.setOnClickListener(new NumberClickEvent(textView,s,i));   
     } 

     int[] opButtons = new int[] { R.id.add, R.id.subtract, R.id.multiply, R.id.divide }; 
     State.Operation[] states = new State.Operation[] { 
       State.Operation.PLUS, 
       State.Operation.MINUS, 
       State.Operation.MULTIPLY, 
       State.Operation.DIVIDE}; 

     for(int i = 0; i < opButtons.length;i++){ 
     Button b_op = (Button) findViewById(opButtons[i]); 
     b_op.setOnClickListener(new OperationClickEvent(textView, s, states[i])); 
     } 

// Memory functions 
     int[] memButtons = new int[] { R.id.MC, R.id.MR, R.id.Mdeduct, R.id.Mplus}; 
     State.Operation[] mstates = new State.Operation[] { 
       State.Operation.MEMORYCLEAR, 
       State.Operation.MEMORYCALL, 
       State.Operation.MEMORYMINUS, 
       State.Operation.MEMORYPLUS}; 

     for(int i = 0; i < memButtons.length;i++){ 
     Button b_mem = (Button) findViewById(memButtons[i]); 
     b_mem.setOnClickListener(new OperationClickEvent(textView, s, states[i])); 
     } 
// Memory functions  

//decimal 
//  Button b_decimal = (Button) findViewById(R.id.decimal); 
//  b_decimal.setOnClickListener(new DecimalClickEvent(textView, s, ".")); 
//decimal 

     Button b_eq = (Button) findViewById(R.id.equal); 
     b_eq.setOnClickListener(new EqualClickEvent(textView, s)); 

     Button b_op = (Button) findViewById(R.id.ac); 
     b_op.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       s.clear(); 
       textView.setText(s.getDisplay()); 
      } 
     });    
    }  
@Override 
    public void onSaveInstanceState(Bundle savedInstanceState) { 
     savedInstanceState.putSerializable("STATE", s); 
    } 

    @Override 
    public void onRestoreInstanceState(Bundle savedInstanceState) { 
     Serializable serializable = savedInstanceState.getSerializable("STATE"); 
     if(serializable!= null){ 
      s = (State) serializable; 
     } 
    } 

    public void onPause(){ 
     super.onPause(); 
    } 

} 

============= ================== State.java ============================= =====

package com.trial.newcalculator; 

import java.io.Serializable; 
import android.text.Editable; 
import android.widget.TextView; 

public class State implements Serializable { 
    private static final long serialVersionUID = -1231231231231233L; 
    public TextView output; 
    public enum Operation {  
     PLUS,  
     MINUS,  
     MULTIPLY,  
     DIVIDE,  
     MEMORYPLUS, 
     MEMORYMINUS, 
     MEMORYCALL, 
     MEMORYCLEAR, 
    } 
    public enum IOState{   
     INPUTTING,  
     DISPLAY_RESULT, 
    } 
    private Double accu = null; 
    private double current = 0; 
    private double memory = 0; 
    private Operation currentOp = null; 
    private IOState currentState = IOState.INPUTTING; 
    public Operation getCurrentOp() {  
     return currentOp; 
    } 
    public void setCurrentOp(Operation currentOp) {  
     if (currentState == IOState.INPUTTING){   
      if (accu != null && this.currentOp != null){calculateResult(); 
      } 
      else{accu = Double.valueOf(current);current = 0; 
      } 
     } 
     this.currentOp = currentOp;  
     if (currentState == IOState.INPUTTING){ 
      currentState = IOState.DISPLAY_RESULT; 
     } 
    } 
    private void calculateResult() { 
     double res = accu.doubleValue(); 
     switch (currentOp) { 
      case PLUS: 
       res += current; 
       break; 
      case MINUS: 
       res -= current; 
       break; 
      case MULTIPLY: 
       res *= current; 
       break; 
      case DIVIDE: 
       res /= current; 
       break; 
      case MEMORYPLUS: 
       memory += current; 
       break; 
      case MEMORYMINUS: 
       memory -= current; 
       break; 
      case MEMORYCLEAR: 
       memory = 0; 
       break; 
      case MEMORYCALL: 
       current = memory; 
       break; 
     } 
     accu = Double.valueOf(res); 
     current = 0; 
    } 
    public void number(int number) { 
     if (currentState == IOState.INPUTTING){ 
      current = current *10 + number; 
     } 
     else if(currentState == IOState.DISPLAY_RESULT){ 
      currentState = IOState.INPUTTING; 
      current = number; 
     } 
    } 
    public String getDisplay() { 
     String res; 
     Double d = getCurrentDisplayValue(); 
     double doubleValue = d.doubleValue(); 
     int intVal = (int)doubleValue; 
     if (intVal == doubleValue){ 
      res = Integer.toString(intVal); 
      } 
     else{ 
      res = d.toString(); 
      } 
     return res; 
    } 
    private Double getCurrentDisplayValue() { 
     Double d = accu; 
     if (currentState == IOState.INPUTTING){ 
      d = Double.valueOf(current); 
     } 
     return d; 
    } 
    public void clear() { 
     accu = null; 
     currentState = IOState.INPUTTING; 
     currentOp = null; 
     current = 0; 
    } 

    public void equal() { 
     if (accu == null || currentOp == null){ 
      return; 
     } 
     calculateResult(); 
     currentState = IOState.DISPLAY_RESULT; 
     currentOp = null; 
     current = getCurrentDisplayValue(); 
     } 
} 

==================== OperationClickEvent.java =============== ================

package com.trial.newcalculator; 

import com.trial.newcalculator.State.Operation; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.TextView; 

final class OperationClickEvent implements OnClickListener { 
    private State s; 
    private TextView textView; 
    private Operation op; 


    public OperationClickEvent(TextView textView, State s, State.Operation op) { 
     super(); 
     this.op = op; 
     this.s = s; 
     this.textView = textView; 
    } 


    public void onClick(View v) { 
     s.setCurrentOp(op); 
     textView.setText(s.getDisplay()); 
    } 
} 

================= EqualClickEvent.java =========================== ============

package com.trial.newcalculator; 

import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.TextView; 

final class EqualClickEvent implements OnClickListener { 
    private State s; 
    private TextView textView; 


    public EqualClickEvent(TextView textView, State s) { 
     super(); 
     this.s = s; 
     this.textView = textView; 
    } 


    public void onClick(View v) { 
     s.equal(); 
     textView.setText(s.getDisplay()); 
    } 
} 

====================== NumberClickEvent.java ====== ============================

package com.trial.newcalculator; 

import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.TextView; 

final class NumberClickEvent implements OnClickListener { 
    private int number; 
    private State s; 
    private TextView textView; 


    public NumberClickEvent(TextView textView, State s, int number) { 
     super(); 
     this.number = number; 
     this.s = s; 
     this.textView = textView; 
    } 


    public void onClick(View v) { 
     s.number(number); 
     textView.setText(s.getDisplay()); 
    } 
} 

回答

0

而不是創造負click事件和doublezeroclickevent新類的,我建議你獲取他們的ID並在點擊特定按鈕時執行正確的功能。

+0

是是......謝謝你的建議...很抱歉用以作爲一個初學者,它只是使事情到單獨的類來使程序更短,更容易登場......燁一些個人的親景...但真的不能解決如何設計1)小數點2)+/- 3)doublezero – pearmak 2012-08-13 12:39:29

+0

對於雙零點,嘗試將特定值乘以100並在點擊特定雙零點時顯示它 – 2012-08-14 04:12:55

+0

感謝您的輝煌理念! – pearmak 2012-08-14 04:43:47

0

每個OnClickListener都可以是一個默認的匿名類,它只會被一個按鈕觸發。 因此,無需將它們命名爲「NegativeClickEvent」,「DoublezeroClickEvent」等。

如果使用「。」,則可以保留布爾變量。被按下,並且只有在沒有時才接受另一個。 如果你想要一個可用的計算器,你還需要一個「退格」按鈕。所以請注意,該點可能會被刪除。 (需要跟蹤其位置)。

爲主導0,你可以用一個簡單的「如果點最初按壓,插入0」。

有實現你想要什麼,而是保持簡單,只處理你需要處理的情況下,許多方面。

其他實現此方法的方法可能包括Double.parseDouble(s),每個按鍵上都有catch(NumberFormatException e),或者使用double作爲緩衝區,並使用按鈕直接對其執行數學運算(例如乘以10並在每個按鈕上添加新數字) - 這將確保輸入有效性而不需要解析String,但實現起來更加複雜。

+0

非常感謝您的建議!是的,我正在考慮增加記憶功能,退格功能和+/-功能。 – pearmak 2012-08-13 16:48:56

+0

上面的代碼是使用Current = current * 10 + number,這可能是因爲你上面說的......但只是一個問題想知道更多,是否會在稍後輸入小數位的工作?如果沒有點,current = current * 10 + num,如果包含dot,current = current + num/10,那麼它會改變寫爲: (但不知道更多的小數點輸入..)無論如何感謝您的建議! – pearmak 2012-08-13 16:55:42

+0

您需要跟蹤小數位以添加current/Math.pow(10,place)。如果您支持退格,則更復雜。其他方法是僅使用小數點進行渲染,並在完成編輯後應用,直到使用整數+小數位置的變量。 – auval 2012-08-13 20:32:06