2010-08-20 239 views
-1

我有以下MapOverlay。下面一行是抛出一个空指针,但我不明白为什么:S mapView.getProjection().toPixels(p, screenPts);任何人都可以帮我吗?空指针异常

public class Mapview extends MapActivity { 
GeoPoint p; 
MapView mapView; 
MapController mc; 

@Override 
protected boolean isRouteDisplayed() { 
return false; 
} 
public int icount = 0; 
MapController mapController; 
MyPositionOverlay positionOverlay; 
private LocationData tweets; 
public int start = 0; 


@Override 
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.main); 



MapView myMapView = (MapView)findViewById(R.id.mapView); 

myMapView.setSatellite(true); 
myMapView.setStreetView(true); 
myMapView.displayZoomControls(false); 
mapController = myMapView.getController(); 

mapController.setZoom(17); 
myMapView.setBuiltInZoomControls(true); 

//Adding points here 


//---Add a location marker--- 
MapOverlay mapOverlay = new MapOverlay(); 
List<Overlay> listOfOverlays = myMapView.getOverlays(); 
listOfOverlays.clear(); 
listOfOverlays.add(mapOverlay);   

myMapView.invalidate(); 

// Add the MyPositionOverlay 
positionOverlay = new MyPositionOverlay(); 
List<Overlay> overlays = myMapView.getOverlays(); 
overlays.add(positionOverlay); 


LocationManager locationManager; 
String context = Context.LOCATION_SERVICE; 
locationManager = (LocationManager)getSystemService(context); 

Criteria criteria = new Criteria(); 
criteria.setAccuracy(Criteria.ACCURACY_COARSE); 
criteria.setAltitudeRequired(false); 
criteria.setBearingRequired(false); 
criteria.setSpeedRequired(false); 
criteria.setCostAllowed(true); 
String provider = locationManager.getBestProvider(criteria, true); 


locationManager.requestLocationUpdates(provider, 2000, 10, locationListener); 
Location location = locationManager.getLastKnownLocation(provider); 
updateWithNewLocation(location); 

} 


private final LocationListener locationListener = new LocationListener() { 
public void onLocationChanged(Location location) { 
    updateWithNewLocation(location); 
} 

public void onProviderDisabled(String provider){ 
    updateWithNewLocation(null); 
} 

public void onProviderEnabled(String provider){ } 
public void onStatusChanged(String provider, int status, 
          Bundle extras){ } 
}; 

private void updateWithNewLocation(Location location) { 
String latLongString =""; 
TextView myLocationText; 
myLocationText = (TextView)findViewById(R.id.myLocationText); 
String addressString = "No address found"; 

if (location != null) { 
    // Update my location marker 
    positionOverlay.setLocation(location); 

    // Update the map location. 
    Double geoLat = location.getLatitude()*1E6; 
    Double geoLng = location.getLongitude()*1E6; 
    GeoPoint point = new GeoPoint(geoLat.intValue(), 
           geoLng.intValue()); 

    mapController.animateTo(point); 

    double lat = location.getLatitude(); 
    double lng = location.getLongitude(); 
    latLongString = "Lat:" + lat + "\nLong:" + lng; 
    Global.lat = lat; 
    Global.lng = lng; 
    double latitude = location.getLatitude(); 
    double longitude = location.getLongitude(); 

    Geocoder gc = new Geocoder(this, Locale.getDefault()); 
    try { 
    List<Address> addresses = gc.getFromLocation(latitude, 
               longitude, 1); 
    StringBuilder sb = new StringBuilder(); 
    if (addresses.size() > 0) { 
     Address address = addresses.get(0); 

     for (int i = 0; i < address.getMaxAddressLineIndex(); i++) 
     sb.append(address.getAddressLine(i)).append("\n"); 

     sb.append(address.getLocality()).append("\n"); 
     sb.append(address.getPostalCode()).append("\n"); 
     sb.append(address.getCountryName()); 
    } 
    addressString = sb.toString(); 
    } catch (IOException e) {} 
} else { 
    latLongString = "No location found"; 
} 
} 

class MapOverlay extends com.google.android.maps.Overlay 
{ 
    @Override 
    public boolean draw(Canvas canvas, MapView mapView, 
    boolean shadow, long when) 
    { 
     super.draw(canvas, mapView, shadow);     

     //---translate the GeoPoint to screen pixels--- 
     Point screenPts = new Point(); 
     mapView.getProjection().toPixels(p, screenPts); 

     //---add the marker--- 
     Bitmap bmp = BitmapFactory.decodeResource(
      getResources(), R.drawable.marker);    
     canvas.drawBitmap(bmp, screenPts.x, screenPts.y-50, null);   
     return true; 
} 

} 
} 
+0

我看不到,'p'来自哪里...... – WarrenFaith 2010-08-20 10:55:46

+0

它早些时候被声明为'Geopoint p;'。我添加了更多的代码来使这个更清晰的抱歉。 – Skizit 2010-08-20 10:59:21

+0

谢谢。我不能的错误,你找出哪个对象是空的? – WarrenFaith 2010-08-20 11:06:54

回答

2

我看到的GeoPoint p的声明,但没有表达,其中p实际上初始化。因此,将null传递给toPixels()方法可能是NPE的一个原因。

试试这个代码,而不是来检查,如果NPE消失:

//---translate the GeoPoint to screen pixels--- 
    if (p == null) return false; 
    Point screenPts = mapView.getProjection().toPixels(p, null); 

(我不喜欢“出”在Java中的参数,toPixels将创建点对象为你 并返回它)

+0

你的代码帮助我进一步调试它。我能够解决余下的问题。基本上我没有提供一点:)谢谢。 – Skizit 2010-08-20 11:49:11

+0

这就是我的预期。 NPE在这个地方唯一的其他原因应该是一个'null'而不是一个MapView或一个'null'而不是一个投影,其中一个案例会是android上的一个严重错误;) – 2010-08-20 11:56:24

0

好吧,似乎公共属性GeoPoint p从来没有被引用 因此pointint null。 (), geoLng.intValue());或者你想在这一行中定义p:

您应该找到要分配p的corredt位置,然后问题就解决了。

0

您需要保留的myMapView,你将在以后使用的参考。做到这一点的方法是使用strong属性将其声明为属性。