【问题标题】:Remove previous Marker and add new Marker in Google Map v2删除以前的标记并在 Google Map v2 中添加新标记
【发布时间】:2013-06-27 02:50:24
【问题描述】:

我想在任何地方长按地图后删除当前标记并在该点重新创建一个新标记。我已经在长按地图时清除了谷歌地图并创建了新标记,但也显示了以前的标记。

我的代码是:

public class EditLocation extends Fragment {

View v;
Context c;
GoogleMap MAP;
Button back;
int loc;
String lat;
boolean isTapped = true;

public EditLocation(Context c, int location, String latitude) {
    // TODO Auto-generated constructor stub
    this.c = c;
    this.loc = location;
    this.lat = latitude;
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    v = inflater.inflate(R.layout.map, container, false);

    int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(c);
    if (status != ConnectionResult.SUCCESS) {
        int requestCode = 10;
        Dialog dialog = GooglePlayServicesUtil.getErrorDialog(status,
                (Activity) c, requestCode);
        dialog.show();
    } else {
        FragmentManager myFM = ((FragmentActivity) c)
                .getSupportFragmentManager();
        final SupportMapFragment myMAPF = (SupportMapFragment) myFM
                .findFragmentById(R.id.fragmentmap);

        MAP = myMAPF.getMap();

        MAP.setMyLocationEnabled(true);

        LocationManager locationManager = (LocationManager) c
                .getSystemService(Context.LOCATION_SERVICE);

        Criteria criteria = new Criteria();

        String provider = locationManager.getBestProvider(criteria, true);

        final Location location = locationManager
                .getLastKnownLocation(provider);
        final LatLng currentPosition = new LatLng(location.getLatitude(),
                location.getLongitude());

        MAP.setOnMapClickListener(new OnMapClickListener() {
            @Override
            public void onMapClick(LatLng point) {
                // TODO Auto-generated method stub

                MAP.addMarker(new MarkerOptions()
                        .position(currentPosition)
                        .snippet(
                                "Lat:" + location.getLatitude() + "Lng:"
                                        + location.getLongitude())
                        .icon(BitmapDescriptorFactory
                                .defaultMarker(BitmapDescriptorFactory.HUE_AZURE))
                        .title("ME"));
                Log.e("lat", "" + point);

            }
        });

        MAP.setOnMapLongClickListener(new OnMapLongClickListener() {

            @Override
            public void onMapLongClick(LatLng point) {
                // TODO Auto-generated method stub

                // isTapped = false;
                MAP.clear();

                MAP.addMarker(new MarkerOptions().position(point)

                .title(point.toString()));

            }

        });

    }

    return v;

}

【问题讨论】:

    标签: android google-maps-markers google-maps-android-api-2


    【解决方案1】:

    只需创建一个新的标记对象,然后在添加新的标记之前,删除之前的标记

    Marker marker;
    
    MAP.setOnMapLongClickListener(new GoogleMap.OnMapLongClickListener() {
    
                    @Override
                    public void onMapLongClick(LatLng arg0) {
                        if (marker != null) {
                            marker.remove();
                        }
                        marker = MAP.addMarker(new MarkerOptions()
                                .position(
                                        new LatLng(arg0.latitude,
                                                arg0.longitude))
                                .draggable(true).visible(true));
                    }
                });
    

    编辑

    对OnMapClick做同样的事情

    MAP.setOnMapClickListener(new OnMapClickListener() {
            @Override
            public void onMapClick(LatLng point) {
                // TODO Auto-generated method stub
    
                    if (marker != null) {
                        marker.remove();
                    }
                marker = MAP.addMarker(new MarkerOptions()
                        .position(currentPosition)
                        .snippet(
                                "Lat:" + location.getLatitude() + "Lng:"
                                        + location.getLongitude())
                        .icon(BitmapDescriptorFactory
                                .defaultMarker(BitmapDescriptorFactory.HUE_AZURE))
                        .title("ME"));
                Log.e("lat", "" + point);
    
            }
        });
    

    【讨论】:

    • 新标记在长按后创建,但之前的标记在再次点击地图后未删除,尽管我已将其删除。
    • 是的......它工作得很好,但小问题是在长按创建的新标记后,但在触摸地图任意位置后自动删除新标记并在当前位置显示以前的标记。
    • 您已在地图上添加了onClick 和onLongClick。并且在两者中您都添加了标记。因此,每当您单击或长按地图时,都会放置一个新标记,删除之前的标记
    • 我认为您应该删除 onClick 并在地图上仅使用 onLongClick。
    • 是的..它是但是在地图上创建新标记后不能设置可点击的false??
    【解决方案2】:

    在添加标记之前清除谷歌地图。像这样:

    @Override
    public void onMapLongClick(LatLng latLng) {
        googleMap.clear();
    
        googleMap.addMarker(new MarkerOptions()
                .position(latLng)
                .title(latLng.toString())
                .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED)));
    }
    

    【讨论】:

    • 它会加载新的标记以及以前的标记
    【解决方案3】:

    这里有一个简单的方法你只需要更改标记的position。将全局对象创建为 Marker marker;
    之后将标记添加到地图中,如

    marker = map.addMarker(markerOptions).position(new Latlng(31.647316, 74.763791));  
    

    然后在需要添加标记的地方使用marker.setPosition(newlaLng);。

    【讨论】:

    • 是的,它有效。我试过了,然后把它贴在这里。
    • 这可行,但您可能希望在初始化后隐藏标记,直到您真正需要它为止。可以设置visibility in MarkerOptions
    【解决方案4】:

    首先清除谷歌地图,然后添加一个新的标记。 检查下面的代码

    mMap.clear();
    
    //google map marker adding code here
    

    【讨论】:

      【解决方案5】:

      请尝试一下打击代码:-

      // Global Variable...
      private Marker mPreviousMarker ;
      
           @Override
              public boolean onMarkerClick(Marker marker) {
                  if (mPreviousMarker != null) {
                      mPreviousMarker.remove();
      
                  }
                  mPreviousMarker = googleMap.addMarker(new MarkerOptions().position(latLng).icon(bitmapDescriptor));
              }
      

      LatLng :- 您要添加的 latlong 和 bitmapDecroptor 是图标。 {只是为了理解}

      【讨论】:

        【解决方案6】:

        只是转发安东尼的答案。

        addMarker 的方法签名是:

        public final Marker addMarker(MarkerOptions选项) 因此,当您通过指定标记的选项将标记添加到 GoogleMap 时,您应该保存返回的 Marker 对象(而不是您用来创建它的 MarkerOptions 对象)。此对象允许您稍后更改标记状态。完成标记后,您可以调用 Marker.remove() 将其从地图中移除。

        顺便说一句,如果你只想暂时隐藏它,你可以通过调用 Marker.setVisible(boolean) 来切换标记的可见性。

        你可以在这里找到答案Remove a marker from a GoogleMap

        【讨论】:

          【解决方案7】:

          对于在这个问题中尝试过第一种解决方案的人,你会得到Marker has not been intialized的错误。。 p>

          因为,我们正在比较 标记 和 null。当我们甚至还没有初始化标记时。

          解决方案:

          Int mMarkerCount = 0; //Global Variable
          Marker mMarker; //Global Variable
          
          if(mMarkerCount > 0){
              if(mMarker != null){
                  mMarker.remove();              
              }
          }
          
          mMarker = mMap.addMarker(new MarkerOptions().position(latLng));
          mMarkerCount++;
          

          问题的解决方案:

          Int mMarkerCount = 0; //Global Variable
          Marker mMarker;
          
          mMap.setOnMapClickListener(new OnMapClickListener() {
              @Override
              public void onMapClick(LatLng latlng) {
                  if(mMarkerCount > 0){
                      if(mMarker != null){
                          mMarker.remove();              
                      }
                  }
          
                  mMarker = mMap.addMarker(new MarkerOptions().position(latLng));
                  mMarkerCount++;  
              }
          });
          

          一开始,计数将是零。因此,标记删除方法不会被调用。一次,标记初始化,计数递增。我们可以通过 remove 方法删除之前的标记,然后创建一个新的标记,如代码所示。

          【讨论】:

            【解决方案8】:
            googleMap.clear();

            @Override
            public void onMapReady(GoogleMap googleMap) {
            
                MarkerOptions markerOptions = new MarkerOptions();
                LatLng latLng = new LatLng(address.getLat(), address.getLng());
                markerOptions.position(latLng);
                googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(latLng, 5));
                googleMap.addMarker(markerOptions);
            
                googleMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {
                    @Override
                    public void onMapClick(LatLng latLng) {
                        if (touchMarker != null) {
                            touchMarker.remove();
                        }
                        googleMap.clear();
                        MarkerOptions markerOptions = new MarkerOptions().position(latLng);
                        touchMarker = googleMap.addMarker(markerOptions);
                        address.setLat(touchMarker.getPosition().latitude);
                        address.setLng(touchMarker.getPosition().longitude);
                       
                    }
                });
            }
            

            【讨论】:

              猜你喜欢
              • 2016-10-12
              • 1970-01-01
              • 2015-12-17
              • 1970-01-01
              • 2018-08-17
              • 2013-05-27
              • 1970-01-01
              • 1970-01-01
              • 2014-12-24
              相关资源
              最近更新 更多