java - 加上或减去我的安卓计算器中的小故障

标签 java android eclipse calculator

我做了一个安卓计算器,最近我给它添加了+/-按钮。我面临的问题是,首先,当我使用它并按下等号按钮时,应用程序崩溃了。此外,只要我单击 +/- 按钮,数字就会变成浮点值,当我键入任何数字时,数字值会在小数点后继续。示例:我有 200,按 +/- 数字变为 200.0,当我键入任何数字时,它变为 200.01。我该如何克服这个问题?有人可以让我知道我的代码需要进行哪些更改吗?这里是。 谢谢。 :)

    public class MainActivity extends Activity {
    Typeface font1, font2;

    TextView tv1;
    private EditText Scr; //textbox screen
    private float NumberBf; //Save screen before pressing button operation;
    private String Operation;
    private ButtonClickListener btnClick;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);  
        setContentView(R.layout.activity_main);
        font1=Typeface.createFromAsset(getAssets(), "digits.ttf");
        Scr=(EditText)findViewById(R.id.editText);
        Scr.setTypeface(font1);
        font2=Typeface.createFromAsset(getAssets(), "alexbrush.TTF");
        tv1=(TextView)findViewById(R.id.textView1);
        tv1.setTypeface(font2);
        Scr = (EditText) findViewById(R.id.editText);
        Scr.setEnabled(false);
        btnClick = new ButtonClickListener();
        int idList[] = {R.id.button0,R.id.button7, R.id.button1, R.id.button8,R.id.button9,R.id.button4,
                R.id.button5,R.id.button6,R.id.button,R.id.button2,R.id.button3,R.id.buttonDot,
                R.id.buttonMul,R.id.buttonDiv,R.id.buttonAdd,R.id.buttonSub,R.id.buttonC,
                R.id.buttonEq, R.id.buttonSqrt, R.id.buttonsquare, R.id.buttonNp
        };

        for(int id:idList){
            View v = (View) findViewById(id);
            v.setOnClickListener(btnClick);
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    public void mMath(String str){
        NumberBf = Float.parseFloat(Scr.getText().toString()); //save the screen
        Operation = str; //save operation
        Scr.setText("0"); //Clear screen
    }

    public void getKeyboard(String str){
        String ScrCurrent = Scr.getText().toString();
        if(ScrCurrent.equals("0"))
            ScrCurrent = "";
        ScrCurrent += str;
        Scr.setText(ScrCurrent);
    }

    public void mResult(){
        float NumAf = Float.parseFloat(Scr.getText().toString());
        float result = 0;
        if(Operation.equals("+")){
            result = NumAf + NumberBf;
        }
        if(Operation.equals("-")){
            result = NumberBf - NumAf;
        }
        if(Operation.equals("*")){
            result = NumAf * NumberBf;
        }
        if(Operation.equals("/")){
            result = NumberBf / NumAf;
        }
        Scr.setText(String.format("%10d", result));
    }

    public void fnSqrt(){
        double Number = Double.parseDouble(Scr.getText().toString());
        Number = Math.sqrt(Number);
        Scr.setText(String.valueOf(Number));
    }

    public void fnSquare(){
        float Number1 = Float.parseFloat(Scr.getText().toString());
        Number1 = pow(Number1, 2);
        Scr.setText(String.valueOf(Number1));
    }

    public void fnNp(){
        float Number = Float.parseFloat(Scr.getText().toString());
        Number = Number*(-1);
        Scr.setText(String.valueOf(Number));
        }

    private float pow(float number1, int i) {
        return number1*number1;
    }

    private class ButtonClickListener implements OnClickListener{
        public void onClick(View v){
            switch (v.getId()){
                case R.id.buttonC: //Clear screen
                    Scr.setText("0");
                    NumberBf = 0;
                    Operation = "";
                    break;
                case R.id.buttonAdd: //function Add
                    mMath("+");
                    break;
                case R.id.buttonSub:
                    mMath("-");
                    break;
                case R.id.buttonMul:
                    mMath("*");
                    break;
                case R.id.buttonDiv:
                    mMath("/");
                    break;
                case R.id.buttonEq:
                    mResult();
                    break;
                case R.id.buttonSqrt:
                    fnSqrt();
                    break;
                case R.id.buttonNp:
                    fnNp();
                    break;    
                case R.id.buttonsquare:
                    fnSquare();
                    break;
                default:
                    String numb = ((Button) v).getText().toString();
                    getKeyboard(numb);
                    break;
            }
        }
    }
}

最佳答案

关于您的第一个问题:您是否遇到空指针异常?

public void mResult(){
    float NumAf = Float.parseFloat(Scr.getText().toString());

不会阻止您尝试将 null String 转换为 float 的语句,这显然会让您的应用程序崩溃。所以包括一个机制来捕获之前的空值。

case R.id.buttonEq:
    if (Scr.getText() != null)
        mResult();
    break;

我认为这是防止您的 mResult() 获得空值的最简单方法。

对于你的第二个问题:它变成了一个 float ,因为你做了

float Number = Float.parseFloat(Scr.getText().toString());`

当您将 200 转换为 float 时,它将变为 200.00,它将作为字符串返回。

编辑:我意识到你也有一个 dotButton(你的代码真的很乱)。建议的替代方案当然不适用于十进制数字,因为它总是转换您的 number 值。要防止这种行为,您可以实现一个简单的 if/else 语句。

public void fnNp() {
    if (Scr.getText().toString().contains(".")) {
        float Number = Float.parseFloat(Scr.getText().toString());
        Number = Number*(-1);
        Scr.setText(String.valueOf(Number));
    } else {
        int number = Integer.parseInt(Scr.getText().toString());
        Number = Number*(-1);
        Scr.setText(String.valueOf(Number));
    }
}

关于java - 加上或减去我的安卓计算器中的小故障,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20167268/

相关文章:

java - Java 中的 Mmimic C++ 模板函数

java - RMI 对象未刷新

android - 带有混淆器的 Ksoap2

java - Eclipse RCP : Running a system command and print output in custom Console

java - 数据库排序与程序化 java 排序

java - Android OpenGL ES Map Globe 就像 iOS 中的 WhirlyGlobe

android - 在 Activity 布局的 Root View 上使用 Android <merge> XML 元素

java - 调用 replace() 时 fragment 的生命周期是什么?

java - 操作栏菜单项未正确着色

java - 在 java 中检查文件作为命令行参数