2012-03-25 6 views
0

Ich versuche eine Anwendung zu erstellen, die OSMDroid und Mapoverlays mit GeoPoints aus der XML-Datei verwendet, aber ich habe ein Problem. Der Code-Editor zeigt mir keinen Fehler oder eine Warnung an, aber wenn ich die Anwendung im Emulator starte, wird angezeigt, dass die Anwendung nicht mehr funktioniert. der Code von mapActivity Dieser:Android, Karten Overlays

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; 
    } 

} 

Und XML-Datei 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> 

ich die Importe Code nicht geschrieben hat becouse sie nehmen Viel Platz. : D

Antwort

1

Zuerst wird die context, die in Ihrer ObjectsOverlay definiert ist, nie festgelegt. Sie sollten einen Context Parameter im Konstruktor hinzu:

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

so dass die verwendeten DialogBuilder in onTap einen Kontext auf den Dialog zu schaffen haben. Ohne dies wird Ihre App höchstwahrscheinlich abstürzen, wenn Sie auf einen Gegenstand tippen.

Als nächstes Sie initialisiert falsch das GeoPoint, sollte es so geschehen:

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

GeoPoint Koordinaten sind nicht doppelt, wie Location Koordinaten. Sie sind int gleich zu koordinieren * 1E6. Verwenden Sie es wie folgt aus:

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

Und das letzte, was, tun Sie

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

in derselben for-Schleife. Aber Sie sollten eigentlich nur addOverlay in der Schleife, wo Sie eins nach dem anderen Objekt durch seine Koordinaten hinzufügen, und fügen Sie die vollständige itemizedOverlay der Karte nach der Schleife. Oh, und Sie könnten das Overlay auch am Anfang (vor der Schleife) hinzufügen und dann mit addOverlay auffüllen. Die Reihenfolge spielt keine Rolle, es ist nur wichtig, das Overlay einmal mit mapOverlays.add hinzuzufügen.

Fix das und sehen, ob noch Fehler auftreten.

Grüße.

+0

Oh und nur eine Sache mit onTap: Ich denke, Sie sollten dialog.create(). Show() statt nur dialog.show() tun. In der Google Maps-Dokumentation gibt es in onTap kein dialog.create() - aber wo immer ich eine Dokumentation für die Arbeit mit Dialogen fand, gab es immer dialog.create() vor dialog.show(). Sie könnten also versuchen, das auch zu beheben. – Dexter