【问题标题】:Multiple marker Click event in android mapsandroid地图中的多个标记单击事件
【发布时间】:2017-06-21 09:15:11
【问题描述】:

我的谷歌地图活动中有一些标记代表一些商店位置。我需要为每个标记编写点击事件,以便我可以为每个商店打开相应的站点。我正在使用以下代码添加标记。

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

【问题讨论】:

  • 您可以为每个标记添加点击事件。你有什么问题?
  • 我不知道如何为每个标记添加点击事件。使用我当前的代码仅最后添加的标记来响应点击。

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


【解决方案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】:

    在 onMarkerClick(...) 中, “如果(marker.equals(myMarker))” 表示 onMarkerClick 只对 myMarker 执行任何操作。
    myMarker 引用最后创建的标记,因为每当调用 createMarker 时它都会被覆盖。 所以建议是去掉“if (marker.equals(myMarker))”

    【讨论】:

      【解决方案3】:

      给每个标记一个OnClickListener

      .setOnClickListener(getOnClickAction());
      

      然后是处理点击的 OnClickListener。

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

      【讨论】:

        【解决方案4】:

        基本上setOnMarkerClickListner会检测您点击了哪个标记。

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

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

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

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

        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】:

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

           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
          }
          

          【讨论】:

            【解决方案6】:

            这是错误的:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-04-05
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-12-31
              相关资源
              最近更新 更多