android地图中的多个标记Click事件

时间:2017-06-21 09:15:11

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

我的Google地图活动中有一些标记表示某些商店位置。我需要为每个标记写点击事件,这样我就可以为每个商店打开相应的网站。我使用以下代码添加标记。

  public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;

    for(int i = 0 ; i < shop.size() ; i++ ) {

        createMarker(shop.get(i).getLat(), shop.get(i).getLon(), shop.get(i).getShopname(),"", R.drawable.ic_location_city);
    }

  mMap.setOnMarkerClickListener(ShoppingPage.this);


}
protected Marker createMarker(double latitude, double longitude, String title, String snippet, int iconResID) {
    mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(latitude, longitude), 9f));

    myMarker = mMap.addMarker(new MarkerOptions()
            .position(new LatLng(latitude, longitude))
            .anchor(0.5f, 0.5f)
            .title(title)
            .snippet(snippet)
            .icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_location_city_black_24dp)));
    return myMarker;

}

当我尝试向标记添加点击监听器时,我无法向所有标记添加点击监听器。我只能将点击事件添加到最后添加的标记。但我需要为地图中的每个标记制作点击事件。请帮我。这是我点击事件的代码。

 public boolean onMarkerClick(final Marker marker) {
    if (marker.equals(myMarker))
    {
        //handle click here
      Log.d("title",""+ marker.getTitle());
        Log.d("position",""+ marker.getPosition());
    }
    return  true;
}

6 个答案:

答案 0 :(得分:1)

在onMarkerClick(...)中,     &#34; if(marker.equals(myMarker))&#34; 意味着onMarkerClick只为myMarker做任何事情 myMarker引用最后创建的标记,因为每当调用createMarker时它都会被覆盖。 所以建议删除&#34; if(marker.equals(myMarker))&#34;

答案 1 :(得分:1)

使用此:

首先让你的应用实现GoogleMap.OnMarkerClickListener然后创建一个Marker数组:

Marker[] marker = new Marker[20]; //change length of array according to you

然后在里面

onMapReady(){
    mMap.setOnMarkerClickListener(this);
for(int i = 0 ; i < shop.size() ; i++ ) {
        marker[i] = createMarker(shop.get(i).getLat(), shop.get(i).getLon(), shop.get(i).getShopname(),"", R.drawable.ic_location_city);
    }

然后终于

@Override
    public boolean onMarkerClick(Marker marker) {
   //you can get assests of the clicked marker
   return false;
}

希望它有所帮助!!!

答案 2 :(得分:0)

这是错误的:

public boolean onMarkerClick(final Marker marker) {
    if (marker.equals(myMarker))
    {
        //handle click here
      Log.d("title",""+ marker.getTitle());
        Log.d("position",""+ marker.getPosition());
    }
    return  true;
}

应该是:

public boolean onMarkerClick(final Marker marker) {

    return  true;
}

marker变量表示点击了哪个标记。顺便说一句,你的问题是毫无意义的,你可以先设置断点,如果发现你错了,那么对所有标记都有反应。

另外,我会喜欢这样的事情:

googleMap.setOnMarkerClickListener(marker ->
{
   /*Do what you need with clicked marker*/
   return true;
});

答案 3 :(得分:0)

为每个标记添加OnClickListener

.setOnClickListener(getOnClickAction());

而不是处理点击的OnClickListener。

View.OnClickListener getOnClickAction(){
        return new View.OnClickListener(){
          public void onClick(View v){
              //Handle Click
              v.getTitle(position);
          }
        };
    }

答案 4 :(得分:0)

基本上 setOnMarkerClickListner 检测到您单击了哪个标记。

如果您没有为标记设置任何标题,我有一种方法可以识别单击了哪个标记。

首先,创建一个标记地图,以标记对象为键,标记名称为值。

private Map<Marker, String> markerMap = new HashMap<>();

然后,将所需的标记添加到 Map 对象。

marker = gMap.addMarker(new MarkerOptions()
          .position(new LatLng(latitude, longitude))
          .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE)));
markerMap.put(marker,gymDataHolder.getTitle());

然后,使用 setOnMarkerClickListner

map.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
    @Override
    public boolean onMarkerClick(Marker marker) {
        Toast.makeText(context, markerMap.get(marker), Toast.LENGTH_SHORT).show();
        return true;
    }
});

答案 5 :(得分:0)

在向地图添加标记时,您可以像这样在商店中为每个标记设置标记

 marker= mGoogleMap!!.addMarker(MarkerOptions().position(latLng)
                     .title(user.name)
                     .icon({Your shop icon})
        marker.tag=shop

然后您可以实现标记点击侦听器

override fun onMarkerClick(p0: Marker?): Boolean {
    if(p0?.tag==null) return false
    var shop=(p0?.tag) as Shop
      Toast.makeText(context,shop?.name,Toast.LENGTH_SHORT).show()
    return true
}