2012-11-20 34 views
2

我一直在使用previous questionGoogle Tutorial嘗試在用戶的當前位置發生更改時在Google地圖視圖中添加多個針圖像。谷歌地圖上的多個針腳Android不起作用

點擊時的每個引腳顯示引腳的經度和緯度。

但是,目前我的代碼只顯示一個引腳,並且在用戶位置發生更改時不會添加其他圖像。我對Android比較陌生,不知道爲什麼這個代碼不起作用?

Map.java:

import java.util.List; 

import android.graphics.drawable.Drawable; 
import android.os.Bundle; 

import com.google.android.maps.GeoPoint; 
import com.google.android.maps.MapActivity; 
import com.google.android.maps.MapController; 
import com.google.android.maps.MapView; 
import com.google.android.maps.Overlay; 
import com.google.android.maps.MyLocationOverlay; 
import com.google.android.maps.OverlayItem; 

import android.util.Log; 


public class Map extends MapActivity { 
    private MapView map; 
    private MapController controller; 
    private double lon, lat; 
    private Drawable drawable; 
    private MapOverlay itemizedoverlay; 
    private List<Overlay> mapOverlays; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.maps); 
     initMapView(); 
     mapOverlays = map.getOverlays(); 
     drawable = this.getResources().getDrawable(R.drawable.pin); 
     itemizedoverlay = new MapOverlay(drawable, this); 
     initMyLocation(); 

    } 





    private void initMapView() { 
     map = (MapView) findViewById(R.id.map); 
     controller = map.getController(); 
     map.setSatellite(true); 
     map.setBuiltInZoomControls(true); 
    } 


    private void initMyLocation() { 
     final MyLocationOverlay overlay = new MyLocationOverlay(this, map); 
     overlay.enableMyLocation(); 
     overlay.enableCompass(); // wont work in emulator 
     overlay.runOnFirstFix(new Runnable() { 
     public void run() { 
      // Zoom in to current location - 1 is word view 
      controller.setZoom(20); 
      controller.animateTo(overlay.getMyLocation()); 
      lon = overlay.getMyLocation().getLongitudeE6(); 

      lat = overlay.getMyLocation().getLatitudeE6(); 
      setLON(lon); 
      setLAT(lat); 
      //-0.959896 
      //51.742953 
      Log.w("test-lon", Double.toString(lon/1E6)); 
      Log.w("test-lat", Double.toString(lat/1E6)); 
      GeoPoint point = new GeoPoint((int)(lat),(int)(lon)); 

      mapOverlays.add(itemizedoverlay); 
      test(point); 
     } 
     }); 





     map.getOverlays().add(overlay); 

    } 

    public void setLON(double x){ //remove? 

     lon = x; 

    } 
public void setLAT(double x){ //remove? 

     lat = x; 
    } 
    public void test(GeoPoint px){ 

     OverlayItem overlayitem = new OverlayItem(px,"Test Point" , "Lat: " + Double.toString(lat/1E6) + "\nLon: " + Double.toString(lon/1E6)); 
     itemizedoverlay.addOverlay(overlayitem); 


    } 


    @Override 
    protected boolean isRouteDisplayed() { 
     // Required method from MapActivity 


     return false; 
    } 
} 

MapOverlay.java:

import java.util.ArrayList; 

import android.app.AlertDialog; 
import android.content.Context; 
import android.graphics.drawable.Drawable; 

import com.google.android.maps.ItemizedOverlay; 
import com.google.android.maps.OverlayItem; 

public class MapOverlay extends ItemizedOverlay { 

    private ArrayList<OverlayItem> mapOverlay = new ArrayList<OverlayItem>(); 
    private Context mContext; 

    public MapOverlay (Drawable defaultMarker, Context context) { 
      super(boundCenterBottom(defaultMarker)); 
      mContext = context; 
     } 

    public MapOverlay(Drawable arg0) { 
     super(boundCenterBottom(arg0)); 

    } 


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

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

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


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

} 
+0

請張貼的答案作爲答案! –

回答

0

ü需要聽在地圖上我們的位置變化和更新工具類LocationListener的。

class LocationsListeners implements LocationListener { 

    @Override 
    public void onLocationChanged(Location location) { 
     setLAT(location.getLatitude()); 
     setLON(location.getLongitude()); 
     setGeoPoint(lat, lon); 
     mapOverlays.add(geoPoint);   
    } 

    @Override 
    public void onProviderDisabled(String provider) { 
     // 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 

    } 

} 

u需要爲計算方法的GeoPoint:

public GeoPoint setGeoPoint(double lat, double lon){ 
     geoPoint = new GeoPoint((int) (lat * 1E6), (int)(lon * 1E6)); 
     return geoPoint; 
    } 

或使用小蓬鬆的位置 - 它的庫,更新我們的位置,並通知U,廣播接收器,非常簡單快速的實現:

嘗試:

http://code.google.com/p/little-fluffy-location-library/

+0

我試圖通過添加'implements LocationListener'和你提供的方法來擴展我的Map.java文件,但是當位置發生變化時它不會添加多個引腳到地圖 –

+0

你的意思是刪除以前的引腳並在新的地方創建一個位置?或者它沒有改變? – Astrorvald

+0

它保持銷在以前的位置。第一個引腳位於地圖發送的第一個位置,並在發送新位置時保留在同一地點。我需要針對每個位置的針 –