2011-04-11 83 views
0

在我的應用程序上,我從遠程服務器接收座標,並且我想在地圖上的座標上標記位置,這發生在onClick方法內部的需求上。問題在於,當我更新位置時,最終會在地圖上顯示多個標記,而不僅僅是當前位置。有什麼辦法在添加下一個標記前刪除上一個標記?在地圖上添加單個標記,Android,Google API

我跟着本教程的步驟:http://developer.android.com/resources/tutorials/views/hello-mapview.html

而且我的代碼是這樣的:

public class AppTwoAndroid extends MapActivity { 
private Button refreshButton; 
double lat, lon; 
ConnectionHandler conhandler; 
/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    MapView mapView = (MapView) findViewById(R.id.mapview); 
    mapView.setBuiltInZoomControls(true); 
    Log.i("AppTwo", "making connectionhandler object"); 
    conhandler = new ConnectionHandler(); 
    conhandler.execute(); 

    Log.i("AppTwo", "making button"); 
    this.refreshButton = (Button)this.findViewById(R.id.close); 

    final List<Overlay> mapOverlays = mapView.getOverlays(); 
    Drawable drawable = this.getResources().getDrawable(R.drawable.androidmarker); 
    final AppTwoAndroidItemizedOverlay itemizedoverlay = new AppTwoAndroidItemizedOverlay(drawable); 

    refreshButton.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      Log.i("AppTwo", "inside onclick"); 
      if (mapOverlays.contains(itemizedoverlay) == true) { 
       mapOverlays.remove(itemizedoverlay); 
      } 
      conhandler.write(); 
      lat = conhandler.retLat(); 
      lon = conhandler.retLon(); 
      lat = lat * 1e6; 
      lon = lon * 1e6; 
      int ilat = (int) lat; 
      int ilon = (int) lon; 
      GeoPoint point = new GeoPoint(ilat ,ilon); 
      OverlayItem overlayitem = new OverlayItem(point, null, "AppOne"); 
      itemizedoverlay.addOverlay(overlayitem); 
      mapOverlays.add(itemizedoverlay); 


      Toast.makeText(getBaseContext(), "lat is: " + lat + " lon is: " + lon 
        , Toast.LENGTH_SHORT).show(); 

      } 
    }); 
} 
@Override 
    protected boolean isRouteDisplayed() { 
     // TODO Auto-generated method stub 
     return false; 
    } 
} 

和我AppTwoAndroidItemizedOverlay類:

public class AppTwoAndroidItemizedOverlay extends ItemizedOverlay { 

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

public AppTwoAndroidItemizedOverlay(Drawable defaultMarker) { 
    super(boundCenterBottom(defaultMarker)); 
    // TODO Auto-generated constructor stub 
} 

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

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

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

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

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

} 

回答

0

在這部分代碼:

if (mapOverlays.contains(itemizedoverlay) == true) { 
     mapOverlays.remove(itemizedoverlay); 
    } 

當您從mapOverlay結構中移除疊加層時,您並不真正清除疊加層,因此當您添加其他項並將其重新添加到mapOverlay時,將會有2個標記。

如果你只是想讓一個標記做一個Overlay,它具有setOverlayItem而不是一個具有'添加'邏輯的列表。 (意思是做一個疊加,只是一個項目,當你添加另一個,只是取代了舊的)

希望它有幫助! :D

+0

嗯有什麼更深入的瞭解如何做到這一點?我有點新到這^^乾杯 – Syllkons 2011-04-11 22:48:51

+0

這很簡單!在你的'公共類AppTwoAndroidItemizedOverlay'中,而不是隻有一個overlayItem的ArrayList,而不是添加到該列表中,只需在'add()'方法中替換它即可。隨意詢問是否仍有疑問 – JQCorreia 2011-04-12 13:08:58

0

在onClick方法中,只需給出

mapOverlays.clear();

這應該清除任何現有的標記。

希望這個作品:)

0

的代碼之前添加這種說法....

mMap.clear();

mMap.clear(); 

    LatLng latLng = new LatLng(gps.getLatitude(), gps.getLongitude()); 
    mMap.animateCamera(CameraUpdateFactory.newLatLng(latLng)); 
    mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(new 
    LatLng(gps.getLatitude(), gps.getLongitude()), 15)); 
    mMap.addMarker(new MarkerOptions().position(latLng).title("")); 
    mMap.setMapType(GoogleMap.MAP_TYPE_TERRAIN); 
相關問題