2012-08-13 74 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