Android的图形页面无法删除标记 [英] Android MapView can't remove marker

查看:123
本文介绍了Android的图形页面无法删除标记的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用locationManager和ItemizedOverlay吸引我的位置标记,问题是当onLocationChanged被触发我得到新的标记drawed而不是最后一个移动到新位置,这是我的onLocationChanged code:

 公共无效onLocationChanged(位置定位){
  myOverlay object1 =新myOverlay(getResources()getDrawable(R.drawable.arrow),MYMAP。);

  如果(位置!= NULL){
   MyMap.invalidate();
   的GeoPoint MyPos =新的GeoPoint(microdegrees(location.getLatitude()),microdegrees(location.getLongitude()));
   MyController.animateTo(MyPos);
   object1.addPoint(MyPos,马的位置,马位);
   MyMap.getOverlays()加(object1)。
  }

 }
 

能否请你帮我解决这个问题?

多谢了。

MapActivity:

 公共类主要扩展MapActivity实现LocationListener的{
  / **第一次创建活动时调用。 * /
  图形页面MYMAP;
  MapController myController的;

    @覆盖
  公共无效的onCreate(包savedInstanceState){
      super.onCreate(savedInstanceState);
      的setContentView(R.layout.main);

      MYMAP =(图形页面)findViewById(R.id.MyGMap);
      MyMap.setBuiltInZoomControls(真正的);

      尝试 {
      getEventsFromAnXML(本);

     }赶上(XmlPullParserException E){
      e.printStackTrace();
     }赶上(IOException异常E){
      e.printStackTrace();
     }
     INT J = 0;

     myOverlay对象=新myOverlay(getResources()getDrawable(R.drawable.marker),MYMAP。);
     而(J< agencies.size()){
         的GeoPoint点=新的GeoPoint(microdegrees(agencies.get(J).getLatitude()),microdegrees(agencies.get(J).getLongitude()));
         字符串山雀;
         字符串德;
         山雀= agencies.get(J).getTspTitle();
         德= agencies.get(J).getTspTitle()+\ nAgence:+ agencies.get(J).getTitle()+
             \ NTEL:+ agencies.get(j)条.getPhone();
         object.addPoint(点,山雀,DES);
         当J = J + 1;
     }


     。MyMap.getOverlays()加(对象);
     myController的= MyMap.getController();
     MyController.setZoom(12);

     LocationManager LM =(LocationManager)getSystemService(Context.LOCATION_SERVICE);
     lm.requestLocationUpdates(LocationManager.GPS_PROVIDER,1000L,500.0f,这一点);

  }

  私人诠释microdegrees(double值){
      返程(INT)(值* 1000000);
  }


  布尔NA = FALSE;
  名单<机构>机构=新的ArrayList<机构>();
  仲介公司=新局();
  INT I = 0;
  字符串TempTspTitle;
  字符串TempTspPhone;
  布尔TempTspEnabled;
  私人字符串getEventsFromAnXML(活动活动)
  抛出XmlPullParserException,IOException异常
  {
   StringBuffer的StringBuffer的=新的StringBuffer();
   资源RES = activity.getResources();
   XmlResourceParser XPP = res.getXml(R.xml.hotels);
   xpp.next();
   INT EVENTTYPE = xpp.getEventType();

   而(EVENTTYPE!= XmlPullParser.END_DOCUMENT)
   {
    如果(EVENTTYPE == XmlPullParser.START_DOCUMENT)
    {
     的StringBuffer.append(---开始的XML ---);
    }
    否则,如果(EVENTTYPE == XmlPullParser.START_TAG)
    {
        如果(xpp.getName()。等于(数据库)){
            字符串名称= xpp.getAttributeValue(NULL,姓名);
            agency.setTspTitle(名称);
            TempTspTitle =名称;
            NA =真;
        }

        如果(xpp.getName()。等于(DataBaseEnabled)){
            xpp.next();
            agency.setTspEnabled(Boolean.parseBoolean(xpp.getText()));
            TempTspEnabled = Boolean.parseBoolean(xpp.getText());
            xpp.nextTag();
        }
        如果(xpp.getName()。等于(标题)){
            xpp.next();
            agency.setTitle(xpp.getText());
            NA = FALSE;
            xpp.nextTag();
        }
        如果(xpp.getName()。等于(地址)){
            xpp.next();
            agency.setAddress(xpp.getText());
            xpp.nextTag();
        }

        如果(xpp.getName()等于(手机)及。&安培; NA ==真){
            xpp.next();
            agency.setTspPhone(xpp.getText());
            TempTspPhone = xpp.getText();
            xpp.nextTag();
        }其他{
            如果(xpp.getName()等于(手机)及。&安培; NA = FALSE){
                xpp.next();
                agency.setPhone(xpp.getText());
                xpp.nextTag();
            }

        }

        如果(xpp.getName()。等于(传真)){
            xpp.next();
            agency.setFax(xpp.getText());
            xpp.nextTag();
        }

        如果(xpp.getName()。等于(电子邮件)){
            xpp.next();
            agency.setMail(xpp.getText());
            xpp.nextTag();
        }
        如果(xpp.getName()。等于(纬度)){
            xpp.next();
            agency.setLatitude(Double.parseDouble(xpp.getText()));
            xpp.nextTag();
        }
        如果(xpp.getName()。等于(经度)){
            xpp.next();
            agency.setLongitude(Double.parseDouble(xpp.getText()));
        }


    }
    否则,如果(EVENTTYPE == XmlPullParser.END_TAG)
    {
        如果(xpp.getName()。等于(数据库)){
            代理=新局();
        }否则,如果(xpp.getName()。等于(机构)){
            agencies.add(一,代理);
            I = I + 1;
            代理=新局();
            agency.setTspTitle(TempTspTitle);
            agency.setTspPhone(TempTspPhone);
            agency.setTspEnabled(TempTspEnabled);
        }

    }


    EVENTTYPE = xpp.next();
   }
   的StringBuffer.append(\ N+尺寸+ agencies.size());
   返回stringBuffer.toString();
  }

  @覆盖
    保护的布尔isRouteDisplayed(){
        返回false;
    }


    公共无效onLocationChanged(位置定位){
        myOverlay object1 =新myOverlay(getResources()getDrawable(R.drawable.arrow),MYMAP。);

        如果(位置!= NULL){
            MyMap.getOverlays()删除(object1)。
            MyMap.invalidate();
            的GeoPoint MyPos =新的GeoPoint(microdegrees(location.getLatitude()),microdegrees(location.getLongitude()));
            MyController.animateTo(MyPos);
            object1.addPoint(MyPos,马的位置,马位);
            MyMap.getOverlays()加(object1)。
        }

    }

    公共无效onProviderDisabled(字符串提供商){
        // TODO自动生成方法存根

    }

    公共无效onProviderEnabled(字符串提供商){
        // TODO自动生成方法存根

    }

    公共无效onStatusChanged(字符串商,INT地位,捆绑演员){
        // TODO自动生成方法存根

    }
 

和myOverlay类:

 公共类myOverlay扩展ItemizedOverlay< OverlayItem> {

    名单< OverlayItem>分=新的ArrayList< OverlayItem>();
    私人绘制对象标记= NULL;
    私人语境℃;
    公共myOverlay(可绘制标志,图形页面图形页面){
        超(标记);
        this.marker =标记;
        C = mapView.getContext();
    }

    @覆盖
    保护OverlayItem createItem中(int i)以{
        返程(points.get(一));
    }

    公共无效画(油画画布,图形页面图形页面,布尔影子){
        super.draw(帆布,图形页面,阴影);
        boundCenterBottom(标记);
    }

    @覆盖
    公众诠释大小(){
        返回points.size();
    }

    公共无效addPoint(GeoPoint对象点,串标题,desc字符串){
        this.points.add(新OverlayItem(点,滴定度,DESC));
        填充();
    }

    公共无效removePoint(){
        this.points.clear();
        填充();
    }

    @覆盖
    受保护的布尔中的onTap(int i)以{
        Toast.makeText(C,points.get(我).getSnippet(),Toast.LENGTH_SHORT).show();
        返回(真);
    }

  }

    }
 

解决方案

据戴夫的建议,这解决了这一问题:

 公共无效onLocationChanged(位置定位){
    如果(mMyOverlay == NULL){
        mMyOverlay =新myOverlay(getResources()getDrawable(R.drawable.arrow),MYMAP。);
        。MyMap.getOverlays()加(mMyOverlay);
    }其他{
        。MyMap.getOverlays()删除(mMyOverlay);
        MyMap.invalidate();
        mMyOverlay =新myOverlay(getResources()getDrawable(R.drawable.arrow),MYMAP。);
        。MyMap.getOverlays()加(mMyOverlay);
    }
    如果(位置!= NULL){
        MyMap.invalidate();
        的GeoPoint MyPos =新的GeoPoint(microdegrees(location.getLatitude()),microdegrees(location.getLongitude()));
        MyController.animateTo(MyPos);
        mMyOverlay.addPoint(MyPos,马的位置,马位);
     }
 

感谢..

I'm using locationManager and ItemizedOverlay to draw My Location marker, the problem is when onLocationChanged is triggered I'm getting new marker drawed and not the last one moved to the new location, here is my onLocationChanged code :

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);
  }

 }

Can you please help me solve this issue ?

Thanks a lot.

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

    }

and myOverlay Class :

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);
    }

  }      

    }

解决方案

according to Dave's suggestion this fixed the problem :

  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");
     }

thanks..

这篇关于Android的图形页面无法删除标记的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆