-2

私はJavaでAndroid用の基本的な計算機をやっています。電卓は機能しましたが、すべてのコードが1つのクラスに含まれていました。次に、コードを読みやすくしたかったので、別のCalculationクラスを作成し、そこに計算コードを配置しました。そして今、何らかの理由で私のアプリがクラッシュします。LogCatによると:NullPointerException。(私のアプリは正常に起動し、変換する通貨を選択し、ImageButton(変換)をクリックするとアプリがクラッシュします)。これが私のコードです:

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

アクティビティでCalculateクラスを拡張しないでください。計算クラスの拡張アクティビティを削除します

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

これは他の活動の見方を得るのは間違っています........。

あなたはCroToEurにいて、ヌルになる計算アクティビティのHRKfieldにアクセスしています

だからすべきpass the data from CroToEur activity to Calculate activity using intentであり、et that in HRKfield in onCreate of CroToEur

于 2012-06-27T09:38:41.613 に答える
0

onCreate()メソッドが欠落setContentViewしてCalculate.classいるため、編集テキスト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 に答える