2012-03-25 1 views
0

xmlファイルからgeoPointsでOSMDroidとmapoverlaysを使用するアプリケーションを作成しようとしていますが、問題があります。コードエディタでエラーや警告は表示されませんが、エミュレータでアプリケーションを実行すると、アプリケーションが動作を停止したことが示されます。 この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のループ内で、座標で1つのオブジェクトを追加し、ループの後に完全なitemizedOverlayをマップに追加する必要があります。 ああ、また、最初(ループの前)にオーバーレイを追加し、addOverlayを使用してオーバーレイを設定することもできます。順序は関係ありません。オーバーレイを1回追加するのはmapOverlays.addです。

エラーが修正され、エラーがまだ発生するかどうかを確認します。

よろしくお願いいたします。

+0

ああ、onTapを使ったほんの1つ:dialog.show()の代わりにdialog.create()。show()を行うべきだと思います。 Googleのマップドキュメントでは、onTapにはdialog.create()はありませんが、ダイアログを操作するためのドキュメントがあるところではいつも、dialog.show()の前に常にdialog.create()があります。だからあなたもそれを修正しようとすることができます。 – Dexter

関連する問題