【问题标题】:I want to replace a Marker from a map when user visits that location ( gets near a Marker )当用户访问该位置(靠近标记)时,我想从地图中替换标记
【发布时间】:2016-09-29 13:13:59
【问题描述】:

首先,我像这样绘制Marker

public void addMarker(String title,String  lat,String Lng,int id,String address,int f)
{    
        marker= mMap.addMarker(new MarkerOptions().snippet(title)
                .title(title+", "+address)
                .position(new LatLng(Double.valueOf(lat), Double.valueOf(Lng)))
                .icon(BitmapDescriptorFactory.fromResource(id)));

        LatLng coordinate = new LatLng(Double.valueOf(lat), Double.valueOf(Lng));
        CameraUpdate yourLocation = CameraUpdateFactory.newLatLngZoom(coordinate, 10);
        mMap.animateCamera(yourLocation);
        mMarkerArray.add(marker);
}

之后,当我到达任何现有的Location时,我会尝试用另一个图标替换标记

@Override
public void onLocationChanged(Location location)
{
    Log.d("latitude_main", "onlocation???");
    Geocoder geocoder;
    List<Address> addresses;
    geocoder = new Geocoder(this, Locale.getDefault());
    double latitude = location.getLatitude();
    double longitude = location.getLongitude();
    Log.e("latitude_main", "latitude--" + latitude+"longitude="+longitude);

    current_lat= String.valueOf(latitude);
    current_lng= String.valueOf(longitude);
    Log.e("latitude_main","size-=="+salesmanlocationArrayList.size() );

   for(int i=0;i<salesmanlocationArrayList.size();i++)
   {           
       if(salesmanlocation.getLati().equals("12.9165757") && salesmanlocation.getLongi().equals("77.6101163"))
       {           
            mMap.addMarker(new MarkerOptions()
                   .snippet(""+i).title(salesmanlocation.getFirm_name()+", "+salesmanlocation.getAddress())
                   .position(new LatLng(Double.valueOf(salesmanlocation.getLati().toString()), Double.valueOf(salesmanlocation.getLongi().toString())))
                   .icon(BitmapDescriptorFactory.fromResource(R.drawable.event_events_select)));
       }
       mapFragment.getMapAsync(this);
   }
}

我想在用户访问该位置时从地图上删除标记。

【问题讨论】:

  • 从地图中清除上一个标记,然后添加新标记。

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


【解决方案1】:

您可以简单地定义一个执行您的任务的OnMyLocationChangeListener 类,并将其设置在您的GoogleMap 实例上,这样您就可以在您的应用程序中随时使用它。

第 1 步 - 定义您的听众

public class MyMarkerLocationListener implements GoogleMap.OnMyLocationChangeListener {

    List<Marker> markerList;
    int MY_DISTANCE;
    GoogleMap mMap;

    public MyMarkerLocationListener(List<Marker> markerList, int meters, GoogleMap mMap)
    {
        this.markerList = markerList;
        this.MY_DISTANCE = meters;
        this.mMap = mMap;
    }

    @Override
    public void onMyLocationChange(Location location) {

        // your code/logic
        //...

        Location myNewLocation = location;
        Location someMarkerLocation = new Location("some location");

        //for each marker on your list
        //check if you are close to it
        for (Marker m : markerList) {

            LatLng markerPosition = m.getPosition();

            someMarkerLocation.setLatitude(markerPosition.latitude);
            someMarkerLocation.setLongitude(markerPosition.longitude);

            if (myNewLocation.distanceTo(someMarkerLocation) < MY_DISTANCE) {

                //remove marker
                m.remove();

                //or if you still want to use it later
                //m.setVisible(false);

                // add your new marker
                //mMap.addMarker(new MarkerOptions().icon()....);
            }

        }
    }
}

定义类后,您只需在片段或活动代码的地图上设置侦听器 =)

第 2 步 - 实例化监听器并设置它

MyMarkerLocationListener myListener = new MyMarkerLocationListener(mMarkerArray, 100, mMap);
mMap.setOnMyLocationChangeListener(myListener);

更新以在 cmets 中回答您的问题:

你应该在使用它之前初始化mMap,看看这个Stackoverflow question的这段代码

    public class MapPane extends Activity implements OnMapReadyCallback {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.map_activity);

    MapFragment mapFragment = (MapFragment) getFragmentManager()
            .findFragmentById(R.id.map);
    mapFragment.getMapAsync(this);
}

@Override
public void onMapReady(GoogleMap map) {
//DO WHATEVER YOU WANT WITH GOOGLEMAP
 map.setMapType(GoogleMap.MAP_TYPE_HYBRID);
        map.setMyLocationEnabled(true);
        map.setTrafficEnabled(true);
        map.setIndoorEnabled(true);
        map.setBuildingsEnabled(true);
        map.getUiSettings().setZoomControlsEnabled(true);
    }
}

不要忘记您的活动应该实现 OnMapReadyCallback 接口,以便调用 onMapReady 方法

地图准备好后才能使用

希望这会有所帮助!

【讨论】:

  • 感谢您的回复,但我仍然收到空指针异常
  • @user3881024 你跟踪到空指针的来源了吗?
  • @user3881024 如果我是你,我会逐行、一步一步地进入调试模式,这样我就可以追踪它。您还确定需要调用 mapFragment.getMapAsync(this);在那个循环里面?除非我遗漏了你在这种方法中根本不需要的东西
  • mMap.setOnMyLocationChangeListener(myListener);
  • 在这一行我得到空指针
猜你喜欢
  • 2014-01-31
  • 2013-12-05
  • 1970-01-01
  • 2013-10-14
  • 1970-01-01
  • 2014-08-30
  • 1970-01-01
  • 1970-01-01
  • 2011-04-27
相关资源
最近更新 更多