2013-03-18 5 views
0

안녕하세요 저는 항목화된 오버레이를 사용하여지도에 위도와 경도의 배열을 표시하려고합니다. 나는 뒤에 오는 과실을 얻고있다. 문제는 일 수 있었다. 여기에>안드로이드에서 아이템 화 된 오버레이를 사용할 때 Null 포인터

03-18 23:52:06.834: W/dalvikvm(2949): threadid=1: thread exiting with uncaught exception (group=0x40b01428) 
03-18 23:52:06.844: E/AndroidRuntime(2949): FATAL EXCEPTION: main 
03-18 23:52:06.844: E/AndroidRuntime(2949): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.rahul.besttracker/com.rahul.besttracker.Mapview}: java.lang.NullPointerException 
03-18 23:52:06.844: E/AndroidRuntime(2949):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java) 
03-18 23:52:06.844: E/AndroidRuntime(2949):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java) 
03-18 23:52:06.844: E/AndroidRuntime(2949):  at android.app.ActivityThread.access$600(ActivityThread.java) 
03-18 23:52:06.844: E/AndroidRuntime(2949):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java) 
03-18 23:52:06.844: E/AndroidRuntime(2949):  at android.os.Handler.dispatchMessage(Handler.java) 
03-18 23:52:06.844: E/AndroidRuntime(2949):  at android.os.Looper.loop(Looper.java) 
03-18 23:52:06.844: E/AndroidRuntime(2949):  at android.app.ActivityThread.main(ActivityThread.java) 
03-18 23:52:06.844: E/AndroidRuntime(2949):  at java.lang.reflect.Method.invokeNative(Native Method) 
03-18 23:52:06.844: E/AndroidRuntime(2949):  at java.lang.reflect.Method.invoke(Method.java) 
03-18 23:52:06.844: E/AndroidRuntime(2949):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java) 
03-18 23:52:06.844: E/AndroidRuntime(2949):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java) 
03-18 23:52:06.844: E/AndroidRuntime(2949):  at dalvik.system.NativeStart.main(Native Method) 
03-18 23:52:06.844: E/AndroidRuntime(2949): Caused by: java.lang.NullPointerException 
03-18 23:52:06.844: E/AndroidRuntime(2949):  at com.google.android.maps.ItemizedOverlay.populate(ItemizedOverlay.java) 
03-18 23:52:06.844: E/AndroidRuntime(2949):  at com.rahul.besttracker.HelloItemizedOverlay.addOverlay(HelloItemizedOverlay.java:37) 
03-18 23:52:06.844: E/AndroidRuntime(2949):  at com.rahul.besttracker.Mapview.onCreate(Mapview.java:56) 
03-18 23:52:06.844: E/AndroidRuntime(2949):  at android.app.Activity.performCreate(Activity.java) 
03-18 23:52:06.844: E/AndroidRuntime(2949):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java) 
03-18 23:52:06.844: E/AndroidRuntime(2949):  ... 12 more 
03-18 23:52:07.935: D/Process(2949): killProcess, pid=2949 

이 경우에서 onCreate 루프 내지도보기 클래스

package com.rahul.besttracker; 

import java.util.ArrayList; 
import java.util.List; 

import com.google.android.maps.GeoPoint; 
import com.google.android.maps.MapActivity; 
import com.google.android.maps.MapView; 
import com.google.android.maps.Overlay; 
import com.google.android.maps.OverlayItem; 

import android.graphics.drawable.Drawable; 
import android.os.Bundle; 

public class Mapview extends MapActivity { 
MapView map; 
ArrayList<String> mArrayList; 
double[] Lat; 
double[] Lon; 

String stops[]; 
int latarr[], lonarr[]; 
OverlayItem overlayitem; 

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

    map = (MapView) findViewById(R.id.Map); 
    // map.setBuiltInZoomControls(true); 
    // setContentView(R.layout.maps); 
    Bundle gotBasket = getIntent().getExtras(); 
    mArrayList = gotBasket.getStringArrayList("stops"); 
    Lat = gotBasket.getDoubleArray("Lat"); 
    Lon = gotBasket.getDoubleArray("Lon"); 

    System.out.println("SIZE+++" + Lat.length + " " + Lon.length); 
    for (int i = 0; i < mArrayList.size(); i++) { 
     System.out.println(" \n" + Lat[i] + "\t" + Lon[i]); 
    } 
    // stops=(String[]) mArrayList.toArray(); 

    List<Overlay> mapOverlays = map.getOverlays(); 
    Drawable drawable = this.getResources().getDrawable(
      R.drawable.mark_blue); 
    HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(
      drawable, this); 

    for (int i = 0; i < mArrayList.size(); i++) { 

     if (Lat[i] > 0 && Lon[i] > 0) { 
      GeoPoint point = new GeoPoint((int) (Lat[i] * 1E6), 
        (int) (Lon[i] * 1E6)); 
      overlayitem = new OverlayItem(point, mArrayList.get(i), null); 
     } 
     itemizedoverlay.addOverlay(overlayitem); 
     mapOverlays.add(itemizedoverlay); 
    } 
} 

@Override 
protected boolean isRouteDisplayed() { 
    // TODO Auto-generated method stub 
    return false; 
} 

}

답변

0

당신에 내 HelloItemizedOverlay 클래스

package com.rahul.besttracker; 

    import java.util.ArrayList; 

    import android.app.AlertDialog; 
    import android.content.Context; 
    import android.graphics.drawable.Drawable; 

    import com.google.android.maps.ItemizedOverlay; 
    import com.google.android.maps.OverlayItem; 

    public class HelloItemizedOverlay extends ItemizedOverlay { 
private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>(); 
Context mContext; 

public HelloItemizedOverlay(Drawable defaultMarker) { 
    super(boundCenterBottom(defaultMarker)); 
    // TODO Auto-generated constructor stub 
} 

public HelloItemizedOverlay(Drawable defaultMarker, Context context) { 
    super(boundCenterBottom(defaultMarker)); 
    mContext = context; 
} 

@Override 
protected OverlayItem createItem(int i) { 
    return mOverlays.get(i); 
} 

@Override 
public int size() { 
    return mOverlays.size(); 
} 

public void addOverlay(OverlayItem overlay) { 

    mOverlays.add(overlay); 
    populate(); <--------------GETTING ERROR HERE 
} 

@Override 
protected boolean onTap(int index) { 
    OverlayItem item = mOverlays.get(index); 
    AlertDialog.Builder dialog = new AlertDialog.Builder(mContext); 
    dialog.setTitle(item.getTitle()); 
    dialog.setMessage(item.getSnippet()); 
    dialog.show(); 
    return true; 
} 
    } 

이며, 여기에 너는 on 문으로 if 문을 실행하면 오버레이 항목을 인스턴스화하지 않으므로 오버레이에 null 포인터를 추가하게됩니다. 이것은 결국 충돌을 일으킬 것입니다. add는 if의 일부 여야합니다.

+0

설명해 주실 수 있습니다 .. 진술을받지 못했습니다 .. 죄송합니다 .... –

+0

YOUR for 루프 onCreate는 if 문 내부의 변수 overlayitem에 대한 유효한 값만 설정하고 있습니다. 그것의 바깥에있는 if 문. 조건이 거짓이면 overlayitem이 null임을 의미합니다. 그러나 당신은 여전히 ​​이것을 맵에 표시하는 것으로 추가하고 있습니다. 결과적으로 널 포인터 오류가 발생합니다. –

+0

좋아요. 많이 부탁드립니다. –