【问题标题】:adding single marker on map, Android, Google API在地图、Android、Google API 上添加单个标记
【发布时间】:2011-04-11 13:50:40
【问题描述】:

在我的应用程序中,我从远程服务器接收坐标,我想在地图上的坐标上标记位置,这在 onClick 方法中按需发生。问题是,当我更新位置时,我最终会在地图上出现多个标记,而不是只有一个,即当前位置。在添加下一个标记之前有什么方法可以删除前一个标记?

我按照本教程中的步骤操作: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();
}

}

【问题讨论】:

    标签: android google-maps marker


    【解决方案1】:

    在 onClick 方法中只需给出

    mapOverlays.clear();

    这应该清除所有现有的标记。

    希望这可行:)

    【讨论】:

      【解决方案2】:

      在这部分代码中:

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

      当您从 mapOverlay 结构中删除叠加层时,您并没有真正清除叠加层,因此当您添加其他项目并将其重新添加到 mapOverlay 时,将会有 2 个标记。

      如果您只想要一个标记,请使用具有 setOverlayItem 的 Overlay 而不是具有“添加”逻辑的列表。 (意味着只使用一个项目进行叠加,当您添加另一个项目时,只需替换旧项目)

      希望对您有所帮助! :D

      【讨论】:

      • 嗯更多关于如何做到这一点的见解?我对此有点陌生^^干杯
      • 这很简单!在您的 public class AppTwoAndroidItemizedOverlay 中,不是有一个覆盖项的 ArrayList,而是只有一个覆盖项,而不是添加到该列表中,只需在 add() 方法中替换它。如果仍有疑问,请随时询问
      【解决方案3】:

      在代码前加上这条语句....

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-05-26
        • 2013-09-20
        • 1970-01-01
        • 2014-09-22
        • 1970-01-01
        • 2012-12-23
        • 2016-06-22
        相关资源
        最近更新 更多