2011-01-08 84 views
3

我正在使用locationManager和ItemizedOverlay繪製我的位置標記,問題是當onLocationChanged被觸發時我正在繪製新標記,而不是最後一個移動到新位置,這裏是我的onLocationChanged代碼:Android MapView無法刪除標記

public void onLocationChanged(Location location) { 
    myOverlay object1 = new myOverlay(getResources().getDrawable(R.drawable.arrow),MyMap); 

    if(location!=null){ 
    MyMap.invalidate(); 
    GeoPoint MyPos = new GeoPoint(microdegrees(location.getLatitude()),microdegrees(location.getLongitude())); 
    MyController.animateTo(MyPos); 
    object1.addPoint(MyPos,"Ma position","Ma position"); 
    MyMap.getOverlays().add(object1); 
    } 

} 

你能幫我解決這個問題嗎?

非常感謝。

MapActivity:

public class Main extends MapActivity implements LocationListener { 
    /** Called when the activity is first created. */ 
    MapView MyMap; 
    MapController MyController; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     MyMap=(MapView)findViewById(R.id.MyGMap); 
     MyMap.setBuiltInZoomControls(true); 

     try { 
     getEventsFromAnXML(this); 

    } catch (XmlPullParserException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    int j=0; 

    myOverlay object = new myOverlay(getResources().getDrawable(R.drawable.marker),MyMap); 
    while(j<agencies.size()){ 
     GeoPoint point = new GeoPoint(microdegrees(agencies.get(j).getLatitude()),microdegrees(agencies.get(j).getLongitude())); 
     String Tit; 
     String Des; 
     Tit=agencies.get(j).getTspTitle(); 
     Des=agencies.get(j).getTspTitle() + "\nAgence: " + agencies.get(j).getTitle() + 
      "\nTél: " + agencies.get(j).getPhone(); 
     object.addPoint(point,Tit,Des); 
     j=j+1; 
    } 


    MyMap.getOverlays().add(object); 
    MyController=MyMap.getController(); 
    MyController.setZoom(12); 

    LocationManager lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
    lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000L, 500.0f, this); 

    } 

    private int microdegrees(double value){ 
     return (int)(value*1000000); 
    } 


    boolean na=false; 
    List<Agency> agencies = new ArrayList<Agency>(); 
    Agency agency=new Agency(); 
    int i=0; 
    String TempTspTitle; 
    String TempTspPhone; 
    Boolean TempTspEnabled; 
    private String getEventsFromAnXML(Activity activity) 
    throws XmlPullParserException, IOException 
    { 
    StringBuffer stringBuffer = new StringBuffer(); 
    Resources res = activity.getResources(); 
    XmlResourceParser xpp = res.getXml(R.xml.hotels); 
    xpp.next(); 
    int eventType = xpp.getEventType(); 

    while (eventType != XmlPullParser.END_DOCUMENT) 
    { 
    if(eventType == XmlPullParser.START_DOCUMENT) 
    { 
    stringBuffer.append("--- Start XML ---"); 
    } 
    else if(eventType == XmlPullParser.START_TAG) 
    { 
     if (xpp.getName().equals("DataBase")){ 
      String name=xpp.getAttributeValue(null, "name"); 
      agency.setTspTitle(name); 
      TempTspTitle=name; 
      na=true; 
     } 

     if (xpp.getName().equals("DataBaseEnabled")){ 
      xpp.next(); 
      agency.setTspEnabled(Boolean.parseBoolean(xpp.getText())); 
      TempTspEnabled=Boolean.parseBoolean(xpp.getText()); 
      xpp.nextTag(); 
     } 
     if (xpp.getName().equals("Title")){ 
      xpp.next(); 
      agency.setTitle(xpp.getText()); 
      na=false; 
      xpp.nextTag(); 
     } 
     if (xpp.getName().equals("Address")){ 
      xpp.next(); 
      agency.setAddress(xpp.getText()); 
      xpp.nextTag(); 
     } 

     if (xpp.getName().equals("Phone") && na==true){ 
      xpp.next(); 
      agency.setTspPhone(xpp.getText()); 
      TempTspPhone=xpp.getText(); 
      xpp.nextTag(); 
     }else{ 
      if (xpp.getName().equals("Phone") && na==false){ 
       xpp.next(); 
       agency.setPhone(xpp.getText()); 
       xpp.nextTag(); 
      } 

     } 

     if (xpp.getName().equals("Fax")){ 
      xpp.next(); 
      agency.setFax(xpp.getText()); 
      xpp.nextTag(); 
     } 

     if (xpp.getName().equals("e-Mail")){ 
      xpp.next(); 
      agency.setMail(xpp.getText()); 
      xpp.nextTag(); 
     } 
     if (xpp.getName().equals("Latitude")){ 
      xpp.next(); 
      agency.setLatitude(Double.parseDouble(xpp.getText())); 
      xpp.nextTag(); 
     } 
     if (xpp.getName().equals("Longitude")){ 
      xpp.next(); 
      agency.setLongitude(Double.parseDouble(xpp.getText())); 
     } 


    } 
    else if(eventType == XmlPullParser.END_TAG) 
    { 
     if (xpp.getName().equals("DataBase")){ 
      agency = new Agency(); 
     }else if (xpp.getName().equals("Agency")){ 
      agencies.add(i,agency); 
      i=i+1; 
      agency = new Agency(); 
      agency.setTspTitle(TempTspTitle); 
      agency.setTspPhone(TempTspPhone); 
      agency.setTspEnabled(TempTspEnabled); 
     } 

    } 


    eventType = xpp.next(); 
    } 
    stringBuffer.append("\n" + "Size: " + agencies.size()); 
    return stringBuffer.toString(); 
    } 

    @Override 
    protected boolean isRouteDisplayed() { 
     return false; 
    } 


    public void onLocationChanged(Location location) { 
     myOverlay object1 = new myOverlay(getResources().getDrawable(R.drawable.arrow),MyMap); 

     if(location!=null){ 
      MyMap.getOverlays().remove(object1); 
      MyMap.invalidate(); 
      GeoPoint MyPos = new GeoPoint(microdegrees(location.getLatitude()),microdegrees(location.getLongitude())); 
      MyController.animateTo(MyPos); 
      object1.addPoint(MyPos,"Ma position","Ma position"); 
      MyMap.getOverlays().add(object1); 
     } 

    } 

    public void onProviderDisabled(String provider) { 
     // TODO Auto-generated method stub 

    } 

    public void onProviderEnabled(String provider) { 
     // TODO Auto-generated method stub 

    } 

    public void onStatusChanged(String provider, int status, Bundle extras) { 
     // TODO Auto-generated method stub 

    } 

和myOverlay類:

public class myOverlay extends ItemizedOverlay<OverlayItem>{ 

    List<OverlayItem> points= new ArrayList<OverlayItem>(); 
    private Drawable marker=null; 
    private Context c; 
    public myOverlay(Drawable marker, MapView mapView) { 
     super(marker); 
     this.marker=marker; 
     c=mapView.getContext(); 
    } 

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

    public void draw(Canvas canvas,MapView mapView, boolean shadow){ 
     super.draw(canvas, mapView, shadow); 
     boundCenterBottom(marker); 
    } 

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

    public void addPoint(GeoPoint point, String Titre, String Desc){ 
     this.points.add(new OverlayItem(point,Titre,Desc)); 
     populate(); 
    } 

    public void removePoint(){ 
     this.points.clear(); 
     populate(); 
    } 

    @Override 
    protected boolean onTap(int i){ 
     Toast.makeText(c, points.get(i).getSnippet(), Toast.LENGTH_SHORT).show(); 
     return (true); 
    } 

    }  

    } 

回答

3

按照戴夫的建議,這解決了這一問題:

public void onLocationChanged(Location location) { 
    if(mMyOverlay == null) { 
     mMyOverlay = new myOverlay(getResources().getDrawable(R.drawable.arrow),MyMap); 
     MyMap.getOverlays().add(mMyOverlay); 
    }else{ 
     MyMap.getOverlays().remove(mMyOverlay); 
     MyMap.invalidate(); 
     mMyOverlay = new myOverlay(getResources().getDrawable(R.drawable.arrow),MyMap); 
     MyMap.getOverlays().add(mMyOverlay); 
    } 
    if(location!=null){ 
     MyMap.invalidate(); 
     GeoPoint MyPos = new GeoPoint(microdegrees(location.getLatitude()),microdegrees(location.getLongitude())); 
     MyController.animateTo(MyPos); 
     mMyOverlay.addPoint(MyPos,"Ma position","Ma position"); 
    } 

感謝..

1

getOverlays()返回你的MapView的覆蓋對象的列表。每次更新位置時,您的代碼都會在此列表中添加另一個疊加層。你需要做的是刪除以前的覆蓋,或每次完全清空列表。

因此,在您的方法調用getOverlays().clear()之前添加您的新覆蓋。

編輯,或者也許這會指向你在正確的方向嗎?我不知道你的myOverlay課程是如何工作的,所以希望你能填補空白!

protected myOverlay mMyOverlay; 

public void onLocationChanged(Location location) { 
    if(mMyOverlay == null) { 
     mMyOverlay = new myOverlay(getResources().getDrawable(R.drawable.arrow),MyMap); 
     MyMap.getOverlays().add(mMyOverlay); 

    if(location!=null){ 
     MyMap.invalidate(); 
     GeoPoint MyPos = new GeoPoint(microdegrees(location.getLatitude()),microdegrees(location.getLongitude())); 
     MyController.animateTo(MyPos); 
     mMyOverlays.setPoint(MyPos,"Ma position","Ma position"); 
    } 
} 
+1

試圖getOverlays()清()它的工作原理,但會刪除所有現有的覆蓋(我在其他疊加標誌,我應該顯示),也試過getOverlays()。remove(object1),除了最後一個,我還有新的標記。 – Houssem 2011-01-08 13:18:07

+0

您需要跟蹤要保留自己的疊加層。 MapView API無法爲您管理它們。也許在你的類中創建一個覆蓋層(例如。mMyOverlay)並在你的構造函數中實例化它,然後添加到覆蓋列表中。然後在需要時直接更新該對象,而不是在每次更新後刪除/添加到列表中。 – Dave 2011-01-08 13:23:37

1

使用一個ItemizedOverlay和戴維建議,跟蹤你想移動的一個,然後刪除該跟蹤OverlayItem,並添加一個新的或採取跟蹤的一個,得到它的標記或MapPoint和重置其緯度/經度座標到新的位置座標。您可能還需要調用mapView.invalidate()來強制重繪。