Android MapView 无法删除标记

2023-12-04

我正在使用 locationManager 和 ItemizedOverlay 来绘制“我的位置”标记,问题是当触发 onLocationChanged 时,我正在绘制新标记,而不是最后一个移动到新位置的标记,这是我的 onLocationChanged 代码:

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

 }

你能帮我解决这个问题吗?

多谢。

地图活动:

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

  }      

    }

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

  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..

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android MapView 无法删除标记 的相关文章

随机推荐

  • 什么时候不应该使用 Java 中的 static 关键字?

    什么时候在 Java 方法签名上使用 static 关键字被认为是不好的做法 如果一个方法根据某些参数执行一个函数 并且不需要访问非静态的字段 那么您不是总是希望这些类型的方法是静态的吗 在大型 Java 应用程序中您将遇到的两个最大的弊端
  • 在 MVC / ASP.NET 中发布包含列表的模型

    我知道怎么做postASP NET 中表单的对象列表 但假设我想要post同时还有其他一些值 有没有办法有一个表格 像这样
  • 如何在线程内接收 WM_POWERBROADCAST?

    我已经绞尽脑汁一天多了 浏览了大量的资源 试图弄清楚如何接收WM POWERBROADCAST来自线程内的 Windows 消息 目前 我正在使用AllocateHWnd WndMethod 独立组件内部 当我在标准 VCL Forms 应
  • 在 UITableView 中,“visibleCells”的委托是什么?

    当单元格进出设备屏幕时 我希望我的 viewController 确切地知道什么进来了 什么出去了 有没有办法做到这一点 不存在仅适用于 可见单元格 的委托方法 当单元格离开屏幕时 不会调用任何内容 当细胞变得可见时 实际上什么也没有 有的
  • Python:使用()调用方法和不使用()调用方法有什么区别?

    这一定是非常基本和明显的东西 因为我无法通过谷歌或在这里找到答案 当我调用方法时 Python 中的括号有什么区别 带有 pygame 和括号的示例代码 import pygame import sys pygame init screen
  • setInterval 在 Ajax 请求后停止

    我正在使用 Asp net MVC 我希望我的部分视图按一定时间间隔刷新 直到我发出不相关的 Ajax 请求 然后它才会停止 这里有一些简化的片段来说明问题 在 AjaxRefresh js 中 function ajaxRefresh v
  • 如何从 UIImage 中 NSLog 像素 RGB?

    我只想 1 复制像素数据 2 迭代并修改每个像素 仅向我展示如何将 ARGB 值 NSLog 为 255 3 从新的像素数据创建 UIImage 如果有人能告诉我如何将像素的 RGBA 值 NSLog 为 255 我就可以弄清楚血淋淋的细节
  • 从路径读取事件日志文件

    我的问题与这个非常相似如何以编程方式打开事件日志 除了我正在记录任何东西 我需要从多台未连接的机器创建日志条目数据库 我收到 evtx 文件 然后尝试处理它们 现在我正在从导出的 xml 文件中执行此操作 但我想跳过到 xml 转换部分 我
  • ng-src 不适用于 youtube 嵌入视频

    我对 YouTube 嵌入代码有一个小问题 在我的控制器中 scope emedUrl https www youtube com embed
  • Python 中的多态性

    class File object def init self filename if os path isfile filename self filename filename self file open filename rb se
  • 手动响应鼠标悬停事件

    有没有办法触发 React 的 mouseover 和 mouseenter 事件 可以开火 ReactDOM findDOMNode someNode focus ReactDOM findDOMNode someNode click 有
  • PHP 找不到保存处理程序内存缓存

    我正在为这个问题绞尽脑汁 它应该很简单 但似乎找不到解决方案 所以希望你们中的一个人可以帮助我 我正在尝试使用 php 的 memcache 扩展来存储会话 我正在运行 MAMP 并已正确安装了扩展 我认为 它在我执行 phpinfo 时显
  • JPA中NamedQuery注解有什么好处?

    刚才我写了一个NamedQuery对于 JPA 实体 我们对此感到非常高兴 这里是 NamedQuery name Panties RED PANTIES QRY query SELECT p FROM Panties p WHERE p
  • 使用 iTextSharp 在 VB.NET 中读取 PDF 书签

    我正在制作一个工具 可以扫描 PDF 文件并搜索 PDF 书签和正文中的文本 我正在使用带有 VB NET 和 iTextSharp 的 Visual Studio 2008 如何从现有 PDF 文件加载书签列表 这取决于您所说的 书签 时
  • 如何找到采样边界内的最大圆?

    给定一组二维点 这些点是不规则形状的边界 该形状可能不是凸的并且可能有内孔 是否有一种算法可以找到适合边界的最大圆 我已经做了很多搜索 并且确实找到了接近的算法 例如最大的空圆问题 但到目前为止我发现没有一个与我所拥有的约束相匹配 动机 由
  • 将两行文本传递到InputBox中

    我的代码中有以下行要求用户输入 strFind InputBox Please enter the text to look for Replace Text in Files 我需要用户输入由 LF 或 CR 或 CRLF 换行符 分隔的
  • 为什么协议中的仅获取属性要求不能通过符合的属性来满足?

    为什么下面的代码会产生错误 protocol ProtocolA var someProperty ProtocolB get protocol ProtocolB class ConformsToB ProtocolB class Som
  • 在 WP7 中反序列化 JSON

    我有这个 JSON 我正在尝试在 Windows Phone 上读取它 我一直在玩DataContractJsonSerializer和 Json NET 但运气不太好 尤其是阅读每个 条目 lastUpdated 16 12 filter
  • 如何用SQL-Server 2000查询层次信息?

    我有一张桌子Folders包含有关文件夹的分层信息 FolderID FolderName ParentID 1 Folder1 0 2 Folder2 1 3 Folder3 2 4 Folder4 3 For Folder4我想获取以下
  • Android MapView 无法删除标记

    我正在使用 locationManager 和 ItemizedOverlay 来绘制 我的位置 标记 问题是当触发 onLocationChanged 时 我正在绘制新标记 而不是最后一个移动到新位置的标记 这是我的 onLocation