2012-03-25 269 views
0

我想创建一个应用程序,它使用OSMDroid和mapoverlays与xml文件中的geoPoints,但我有一个问题。代码编辑器不会显示错误或警告,但是当我在模拟器中运行应用程序时,它显示应用程序已停止工作。 这mapActivity的代码:Android,地图覆盖

public class MapsActivity extends Activity implements LocationListener, MapViewConstants { 

    private MapView mapView; 
    private MapController mapController; 
    private LocationManager mLocMgr; 
    static final String URL = "data/data/com.siroki.brijeg/data.xml"; 
    // XML node keys 
    static final String KEY_ITEM = "object"; // parent node 
    static final String KEY_ID = "id"; 
    static final String KEY_NAME = "name"; 
    static final String KEY_LON = "lon"; 
    static final String KEY_LAT = "lat"; 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.copymain); 

     mapView = (MapView) this.findViewById(R.id.mapview); 
     mapView.setTileSource(TileSourceFactory.MAPNIK); 
     mapView.setBuiltInZoomControls(true); 
     mapView.setMultiTouchControls(true); 

     mapController = this.mapView.getController(); 
     mapController.setZoom(14); 
     GeoPoint point2 = new GeoPoint(43.3803, 17.5981); 
     mapController.setCenter(point2); 
     mLocMgr = (LocationManager) getSystemService(LOCATION_SERVICE); 
     mLocMgr.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 100, this); 

     mapView.invalidate(); 

     List<Overlay> mapOverlays = mapView.getOverlays(); 
     Drawable marker = this.getResources().getDrawable(R.drawable.ic_launcher); 
     ObjectsOverlay itemizedOverlay = new ObjectsOverlay(marker, null); 

     ArrayList<HashMap<String, String>> menuItems = new ArrayList<HashMap<String, String>>(); 

     XMLParser parser = new XMLParser(); 

     String xml = parser.getXmlFromUrl(URL); 
     Document doc = parser.getDomElement(xml); // getting DOM element 

     NodeList nl = doc.getElementsByTagName(KEY_ITEM); 



     // looping through all item nodes <item> 
     for (int i = 0; i < nl.getLength(); i++) { 
      // creating new HashMap 
      HashMap<String, String> map = new HashMap<String, String>(); 
      Element e = (Element) nl.item(i); 
      // adding each child node to HashMap key => value 
      map.put(KEY_ID, parser.getValue(e, KEY_ID)); 
      map.put(KEY_NAME, parser.getValue(e, KEY_NAME)); 
      map.put(KEY_LON, "Rs." + parser.getValue(e, KEY_LON)); 
      map.put(KEY_LAT, parser.getValue(e, KEY_LAT)); 

      // adding HashList to ArrayList 
      menuItems.add(map); 
      GeoPoint geo = new GeoPoint(Double.parseDouble(parser.getValue(e, KEY_LAT)), Double.parseDouble(parser.getValue(e, KEY_LON))); 
      OverlayItem overlayitem = new OverlayItem("Hellow", "World", geo); 
      itemizedOverlay.addOverlay(overlayitem); 
      mapOverlays.add(itemizedOverlay); 

     } 

    } 

    public void onLocationChanged(Location location) { 
     double lat = 43.3803; 
     double lng = 17.5981 ; 
     GeoPoint gpt = new GeoPoint(lat, lng); 
     mapController.setCenter(gpt); 
     mapView.invalidate(); 
    } 

    @Override 
    public void onProviderDisabled(String arg0) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onProviderEnabled(String provider) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) { 
     // TODO Auto-generated method stub 

    } 



    } 

ObjectsOverlay.java:

public class ObjectsOverlay extends ItemizedOverlay<OverlayItem> { 



    public ObjectsOverlay(Drawable pDefaultMarker, ResourceProxy pResourceProxy) { 
     super(pDefaultMarker, pResourceProxy); 
     // TODO Auto-generated constructor stub 
    } 


    private ArrayList<OverlayItem> mapOverlays = new ArrayList<OverlayItem>(); 

    private Context context; 



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

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

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

     public void addOverlay(OverlayItem overlay) { 
      mapOverlays.add(overlay); 
      this.populate(); 
     } 

    @Override 
    public boolean onSnapToItem(int arg0, int arg1, Point arg2, IMapView arg3) { 
     // TODO Auto-generated method stub 
     return false; 
    } 

} 

和XML文件data.xml中:

<?xml version="1.0" encoding="UTF-8"?> 

<objects> 

    <object> 
     <id>1</id>  

     <name>Siroki</name> 

     <lon>17.602985</lon> 

     <lat>43.374276</lat> 
    </object> 
</objects> 

我没有写的代码进口他们becouse拿很多空间。 :D

回答

1

首先,您的ObjectsOverlay中定义的context永远不会被设置。你应该在构造函数中添加Context参数:

public ObjectsOverlay(Drawable pDefaultMarker, ResourceProxy pResourceProxy, Context context) { 
     super(pDefaultMarker, pResourceProxy); 
     this.context = context; 
    } 

使得onTap使用的DialogBuilder可以有一个背景下产生的对话框。没有这个,你的应用程序很可能会在点击一个项目时崩溃。

接下来,你错误地初始化GeoPoint,就应该这样做:

GeoPoint point = new GeoPoint(19240000,-99120000); 
OverlayItem overlayitem = new OverlayItem(point, "Hola, Mundo!", "I'm in Mexico City!"); 

GeoPoint坐标双,像Location坐标。它们是int等于坐标* 1E6。使用这样的:

int lon = (int)Math.round(lon_as_double*1E6) 

而最后一件事,你在同一个for循环做

itemizedOverlay.addOverlay(overlayitem); 
mapOverlays.add(itemizedOverlay); 

。但是在循环中实际上只需要addOverlay,您可以在其中逐个添加对象,并在循环后将完整的itemizedOverlay添加到地图中。 哦,你也可以在开始处(循环之前)添加叠加层,然后使用addOverlay填充它。顺序无关紧要,只需要用mapOverlays.add添加覆盖图即可。

解决这个问题,看看是否还有错误。

问候。

+0

哦,只有一件事onTap:我认为你应该做dialog.create()。show()而不是dialog.show()。在Google的Map文档中,在onTap中没有dialog.create() - 但无论我在哪里找到用于处理对话的文档,在dialog.show()之前总是有一个dialog.create()。所以你可以尝试解决这个问题。 – Dexter 2012-04-17 23:06:27