2012-03-25 2 views
0

Я пытаюсь создать приложение, использующее OSMDroid и mapoverlays с geoPoints из xml-файла, но у меня есть проблема. Редактор кода не показывает мне ошибку или предупреждение, но когда я запускаю приложение в эмуляторе, он показывает, что приложение перестало работать. Этот код 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

Во-первых, context, определенный в вашем ObjectsOverlay, никогда не устанавливается. Вы должны добавить параметр Context в конструкторе:

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

так что DialogBuilder используется в onTap может иметь контекст для создания диалога на. Без этого ваше приложение, скорее всего, сбой при нажатии на элемент.

Далее, вы неправильно инициализируется 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) 

И последнее, вы

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

в том же для цикла. Но вы должны на самом деле просто addOverlay в цикле, где вы добавляете по одному объекту по его координатам и добавляете полный код itemizedOverlay к карте после цикла. О, и вы также можете добавить наложение в начале (перед циклом), а затем заполнить его с помощью addOverlay. Заказ не имеет значения, важно только добавить накладку с mapOverlays.add.

Исправьте это и проверьте, не произошли ли ошибки.

С уважением.

+0

О, и только одна вещь с onTap: Я думаю, что вы должны сделать dialog.create(). Show(), а не просто dialog.show(). В документации по карте Google в onTap нет диалога dialog.create() - но везде, где я нашел документацию для работы с диалогами, всегда перед диалогом .show() всегда был диалог dialog.create(). Таким образом, вы можете попробовать исправить это тоже. – Dexter

Смежные вопросы