-2

我正在用 Java 为 Android 做基本的计算器。我的计算器能用,但我把所有代码都放在一个班级里。然后我想让代码更具可读性,我创建了另一个计算类并将计算代码放在那里。现在由于某种原因我的应用程序崩溃了。LogCat 说:NullPointerException。(我的应用程序启动良好,然后当我选择要转换的理想货币时,当我点击 ImageButton(convert) 时,应用程序崩溃)。这是我的代码:

CroToEu 类:

package com.eu.calculator;


import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageButton;
import android.widget.TextView;



public class CroToEur extends Activity {

TextView resultView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.cro_to_eur);

    final ImageButton convert = (ImageButton) findViewById(R.id.converButton);
    convertButton(convert);


}


private void convertButton(final ImageButton convert) {

    resultView = (TextView) findViewById(R.id.resultView);

    convert.setOnTouchListener(new View.OnTouchListener() {



        @Override
        public boolean onTouch(View v, MotionEvent event) {

            Calculate now = new Calculate();
            now.croToEu();


            if(event.getAction() == MotionEvent.ACTION_DOWN) {

                convert.setImageResource(R.drawable.convert_button_ontouch);   

                checkForEmptyEntry();

            } else if (event.getAction() == MotionEvent.ACTION_UP) {

                convert.setImageResource(R.drawable.convert_button);
            }
            return false;
        }



        private void checkForEmptyEntry() {


            if(Calculate.HRKfield.getText() == null || "".equals(Calculate.HRKfield.getText().toString())) {

                resultView.setText("You left empty field");
            } else {

            resultView.setText(Calculate.HRKfield.getText()+" HRK = "+Calculate.fixDecimal+" EUR");

            }
        }
    });
}  
}

还有我的计算课:

package com.eu.calculator;


import java.math.BigDecimal;

import android.app.Activity;
import android.widget.EditText;




public class Calculate extends Activity {


public static EditText HRKfield;    //S tem dobimo vrednost iz polja edittext  
public static double EUR = 0.133;//drži vrednost
public static Double HRK;   // Možnost uporabe double za parsing
public static double result; // rezultat
public static BigDecimal fixDecimal; // rezultat pretvori na decimalko



public BigDecimal croToEu() {

HRKfield = (EditText) findViewById(R.id.enterField);



    try {
        HRK = Double.parseDouble(HRKfield.getText().toString()); //tukaj dobimo čisto številko, ki jo uporabnik vnese v polje
        result = HRK * EUR;
        fixDecimal = new BigDecimal(result);
        fixDecimal = fixDecimal.setScale(2, BigDecimal.ROUND_HALF_UP);

    } catch (NumberFormatException e) {

    }
    return fixDecimal;
}

}
4

4 回答 4

1

不要用 Activity 扩展计算类。删除计算类中的扩展活动

于 2012-06-27T09:43:29.393 回答
0
 if(Calculate.HRKfield.getText() == null || "

了解其他活动的观点是错误的............

您在 CroToEur 中并且您正在访问计算活动的 HRK 字段,该字段将为空

所以应该pass the data from CroToEur activity to Calculate activity using intent和set that in HRKfield in onCreate of CroToEur

于 2012-06-27T09:38:41.613 回答
0

你错过了你的onCreate()方法,甚至setContentViewCalculate.class里面,所以它找不到你的edittext HRKfield,所以它正在抛出NullpointerException

于 2012-06-27T09:39:28.617 回答
0

如果您只是想创建一个帮助器类,它会为您进行计算,那么不要在您的Calculate 类上扩展 Activity。而是让您的 croToEu 方法返回一个变量并从另一个类中调用它,如下所示。

Calculate now = new Calculate();
BigDecimal val = now.croToEu();

Id 实际上有如下的计算类

public abstract class Calculate {

    public static final double EUR = 0.133;//drži vrednost

    public static BigDecimal croToEu(double hrkValue) {

        BigDecimal fixDecimal = new BigDecimal(hrkValue * EUR);
        fixDecimal = fixDecimal.setScale(2, BigDecimal.ROUND_HALF_UP);

        return fixDecimal;
    }

}

然后在您的主要活动课程中

BigDecimal val = Calculate.croToEu(hrkValue);
于 2012-06-27T09:39:52.117 回答