0

私は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 を取得しています。

4

0 に答える 0