私はosmデータを使って地図アプリケーションを作っています。地図を表示し、OSMR を使用してユーザーが設定した 2 地点間のルートを取得できました。この時点まで、私のアプリは正常に動作しています。別のアクティビティからバンドルを渡すコードを追加し、このバンドルで渡されたデータを使用して、道路を取得した後にカスタム ダイアログを計算して表示します。データを渡すコードは次のとおりです。
tourist_taxi = (Button) findViewById(R.id.btn_tourist);
normal_taxi = (Button) findViewById(R.id.btn_normal);
tourist_taxi.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent i = new Intent(MenuActivity.this, MapActivity.class);
Bundle bundle = new Bundle();
bundle.putString("taxi_type", "normal");
bundle.putDouble("rateperkm", 32.00);
bundle.putDouble("waiting", 6.40);
i.putExtras(bundle);
startActivity(i);
}
});
normal_taxi.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent i = new Intent(MenuActivity.this, MapActivity.class);
Bundle bundle = new Bundle();
bundle.putString("taxi_type", "tourist");
bundle.putDouble("rateperkm", 438.00);
bundle.putDouble("waiting", 63.00);
bundle.putDouble("maxrate", 1026.00);
i.putExtras(bundle);
startActivity(i);
}
});
計算を行い、ダイアログを表示する方法は次のとおりです。
private void calculateFare(Road road) {
if (road == null)
return;
Bundle bundle = getIntent().getExtras();
double rateperkm = bundle.getDouble("rateperkm");
double waitingcharge = bundle.getDouble("waiting");
double maxrate = bundle.getDouble("maxrate");
String taxi_type = bundle.getString("taxi_type");
if (taxi_type.equals("normal")){
rv = "Rs " + rateperkm + " per Kilometer and Rs " + waitingcharge
+ " per 2 min waiting";
}
if (taxi_type.equals("tourist")){
rv = "Rs " + rateperkm + " for 5 Km and Rs " + waitingcharge
+ " for additional km, Rs " + maxrate + "maximum";
}
final Dialog d = new Dialog(this, R.style.CustomDialogTheme);
d.setContentView(R.layout.fare_popup);
if (road.mStatus == Road.STATUS_DEFAULT) {
distance_value.setText("Could not get distance");
rate_value.setText(rv);
fare_value.setText("Could not calculate fare");
d.show();
return;
}
dv = String.valueOf(road.mLength);
if (taxi_type.equals("normal")){
double fare = (road.mLength * rateperkm) + 10;
fv = String.valueOf(fare);
}
if (taxi_type.equals("normal")){
if (road.mLength < 5.00){
fv = String.valueOf(rateperkm);
}
else{
double fare = ((road.mLength-5)*waitingcharge + rateperkm);
if (fare > maxrate){
fare = maxrate;
}
fv = String.valueOf(fare);
}
}
fare_value.setText(fv);
distance_value.setText(dv);
rate_value.setText(rv);
d.show();
}
この追加の後、私はNPEを取得しています。私は初心者のプログラマーなので、NPE にはあまり詳しくなく、エラー コードからはエラーの原因を追跡できません。これは私のエラーコードです。
06-10 09:46:53.237: W/dalvikvm(384): threadid=1: thread exiting with uncaught exception (group=0x40014760)
06-10 09:46:53.257: E/AndroidRuntime(384): FATAL EXCEPTION: main
06-10 09:46:53.257: E/AndroidRuntime(384): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.nirab.merobhadameter/com.nirab.merobhadameter.MapActivity}: java.lang.NullPointerException
06-10 09:46:53.257: E/AndroidRuntime(384): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1672)
06-10 09:46:53.257: E/AndroidRuntime(384): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1764)
06-10 09:46:53.257: E/AndroidRuntime(384): at android.app.ActivityThread.access$1500(ActivityThread.java:122)
06-10 09:46:53.257: E/AndroidRuntime(384): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1002)
06-10 09:46:53.257: E/AndroidRuntime(384): at android.os.Handler.dispatchMessage(Handler.java:99)
06-10 09:46:53.257: E/AndroidRuntime(384): at android.os.Looper.loop(Looper.java:132)
06-10 09:46:53.257: E/AndroidRuntime(384): at android.app.ActivityThread.main(ActivityThread.java:4025)
06-10 09:46:53.257: E/AndroidRuntime(384): at java.lang.reflect.Method.invokeNative(Native Method)
06-10 09:46:53.257: E/AndroidRuntime(384): at java.lang.reflect.Method.invoke(Method.java:491)
06-10 09:46:53.257: E/AndroidRuntime(384): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
06-10 09:46:53.257: E/AndroidRuntime(384): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
06-10 09:46:53.257: E/AndroidRuntime(384): at dalvik.system.NativeStart.main(Native Method)
06-10 09:46:53.257: E/AndroidRuntime(384): Caused by: java.lang.NullPointerException
06-10 09:46:53.257: E/AndroidRuntime(384): at android.app.Activity.findViewById(Activity.java:1744)
06-10 09:46:53.257: E/AndroidRuntime(384): at com.nirab.merobhadameter.MapActivity.<init>(MapActivity.java:65)
06-10 09:46:53.257: E/AndroidRuntime(384): at java.lang.Class.newInstanceImpl(Native Method)
06-10 09:46:53.257: E/AndroidRuntime(384): at java.lang.Class.newInstance(Class.java:1301)
06-10 09:46:53.257: E/AndroidRuntime(384): at android.app.Instrumentation.newActivity(Instrumentation.java:1022)
06-10 09:46:53.257: E/AndroidRuntime(384): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1663)
06-10 09:46:53.257: E/AndroidRuntime(384): ... 11 more
そのような状況に対処する方法と、それに対する正しいアプローチを知っていただければ幸いです。前もって感謝します。
編集:問題は、setContentView を実行せずに TextView 要素にアクセスしようとしたことでした。これは、calculateFare メソッドの更新されたコードです。
private void calculateFare(Road road) {
if (road == null)
return;
final Dialog d = new Dialog(this, R.style.CustomDialogTheme);
d.setContentView(R.layout.fare_popup);
TextView fare_value = (TextView) findViewById(R.id.fare_value);
TextView rate_value = (TextView) findViewById(R.id.rate_value);
TextView distance_value = (TextView) findViewById(R.id.distance_value);
String fv = "0.00" , rv="0.00" , dv="0.00";
Bundle bundle = getIntent().getExtras();
double rateperkm = bundle.getDouble("rateperkm");
double waitingcharge = bundle.getDouble("waiting");
double maxrate = bundle.getDouble("maxrate");
String taxi_type = bundle.getString("taxi_type");
if (taxi_type.equals("normal")){
rv = "Rs " + rateperkm + " per Kilometer and Rs " + waitingcharge
+ " per 2 min waiting";
}
if (taxi_type.equals("tourist")){
rv = "Rs " + rateperkm + " for 5 Km and Rs " + waitingcharge
+ " for additional km, Rs " + maxrate + "maximum";
}
if (road.mStatus == Road.STATUS_DEFAULT) {
distance_value.setText("Could not get distance");
rate_value.setText(rv);
fare_value.setText("Could not calculate fare");
d.show();
return;
}
dv = String.valueOf(road.mLength);
if (taxi_type.equals("normal")){
double fare = (road.mLength * rateperkm) + 10;
fv = String.valueOf(fare);
}
if (taxi_type.equals("normal")){
if (road.mLength < 5.00){
fv = String.valueOf(rateperkm);
}
else{
double fare = ((road.mLength-5)*waitingcharge + rateperkm);
if (fare > maxrate){
fare = maxrate;
}
fv = String.valueOf(fare);
}
}
fare_value.setText(fv);
distance_value.setText(dv);
rate_value.setText(rv);
d.show();
}
今、私は fare_value.setText(fv); の行で NPE を取得しています。