infoWindow的图像在第一次点击时没有显示,但它可以在第二次点击时使用

时间:2015-05-12 09:36:51

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

我的Android使用谷歌地图android API,InfoWindow的图像在第一次点击时没有显示,但它可以在第二次点击时使用

我使用

自定义infoWindow
void setMapInfoWindow(){
    mMap.setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter() {
        @Override
        public View getInfoWindow(Marker arg0) {
            return null;
        }

        @Override
        public View getInfoContents(Marker arg0) {
            View v = getLayoutInflater().inflate(R.layout.windowlayout, null);
            final ImageView img = (ImageView)v.findViewById(R.id.imageView3);
            //image
            Picasso.with(context).load("http://imgurl").resize(140, 
        }

    });
}

这是我的标记设置过程

void setMarkers(){
    ...

    for (int i = 0; i < jsonArray.length(); i++) {
        JSONObject datas=jsonArray.getJSONObject(i);
        MarkerOptions tmp=new MarkerOptions()
                .title("name")
                .alpha(0.6f)
                .position(new LatLng(123,456));//replace LatLng with sample
        marker=mMap.addMarker(tmp);

    }
    ....
    setMapInfoWindow();
}

完成标记设置后,我调用setMapInfoWindow()函数。

它适用于我的智能手机,但是当您第一次点击infoWindow时,它不会显示图像;但它在第二次点击时显示。

我测试了一些情况:

  1. 将网页图片替换为本地图片,问题仍然存在。
  2. 将所有标记存储到ArrayList中,完成所有过程后,将所有标记设置为showInfoWindow(),然后将所有标记设置为hideInfoWindow()。它有效,但有一个infoWindow无法关闭(最后一个)。
  3. 我正在尝试使用Bitmap来获取图像,但它没有显示图像,我尝试了很多来自stackoverflow的方法。但是在使用Picasso库时它可以工作。
  4. 由于

    问题解决了: 加载时,google网络服务的图片网址似乎会更改为其他网址。

    示例:

      

    https://maps.googleapis.com/maps/api/place/photo?photoreference=

    它将被谷歌改为以下网址:

      

    https://lh4.googleusercontent.com/ ......

    所以我将布尔值not_first_time_showing_info_window更改为int,并回调三次

        int not_first_time_showing_info_window=0;
        //show image
        try {
            if(not_first_time_showing_info_window==2){
                not_first_time_showing_info_window=0;
                Picasso.with(HomeActivity.this).load("http://....").resize(600,400).into(img);
            }
            else if (not_first_time_showing_info_window==1) {
                not_first_time_showing_info_window++;
                Picasso.with(HomeActivity.this).load("http://....").resize(600, 400).into(img,new InfoWindowRefresher(marker));
            }else if(not_first_time_showing_info_window==0){
                not_first_time_showing_info_window++;
                Picasso.with(HomeActivity.this).load("http://....").resize(600,400).into(img,new InfoWindowRefresher(marker));
            }
        } catch (Exception e) {
            img.setImageDrawable(null);
        }
    

3 个答案:

答案 0 :(得分:3)

首先,您可以创建自定义回调类来实现com.squareup.picasso.Callback

 private class InfoWindowRefresher implements Callback {
        private Marker markerToRefresh;

        private InfoWindowRefresher(Marker markerToRefresh) {
            this.markerToRefresh = markerToRefresh;
        }

        @Override
        public void onSuccess() {
            markerToRefresh.showInfoWindow();
        }

        @Override
        public void onError() {}
    }

其次,在您的活动中声明一个布尔变量:

boolean not_first_time_showing_info_window;

第三,实施public View getInfoContents(Marker marker)方法:

   @Override
   public View getInfoContents(Marker marker) {
      View v = getLayoutInflater().inflate(R.layout.custom_window, null);
      ImageView image = (ImageView)v.findViewById(R.id.image_view);

      if (not_first_time_showing_info_window) {
          Picasso.with(MainActivity.this).load("image_URL.png").into(image);

      } else {
          not_first_time_showing_info_window = true;                         
          Picasso.with(MainActivity.this).load("image_URL.png").into(image, new InfoWindowRefresher(marker));
      }
      return v;
   }

您还可以访问this GitHub page以完成实施。

答案 1 :(得分:0)

我认为Google一直在倾听,这是对我有用的解决方案。设置集群时,

getMap().setOnMapLoadedCallback(mOnMapLoaded);

加载地图后,可以从clusterManager中获取所有标记,

private GoogleMap.OnMapLoadedCallback mOnMapLoaded = () -> {
    LogUtil.i(TAG, "Map has been loaded.");
    showInfoWindow();
};

private boolean showInfoWindow() {
    final WorkHeader selected = mWorkContainer.getSelectedHeader();
    Collection<Marker> markers = mClusterManager.getMarkerCollection().getMarkers();
    for (Marker marker : markers) {
        if (marker.getTitle().contains(selected.siteName)) {
            if (marker.getTitle().contains(selected.siteAddress)) {
                mClusterManager.onMarkerClick(marker);
                return true;
            }
        }
    }
    return false;
}

答案 2 :(得分:0)

我在使用Glide而不是毕加索时遇到了同样的问题 但我提出了一个简单的解决方案,我不知道它的效率如何,但是对我来说效果很好,无论如何,我想与您分享

private Marker lastClicked;
private HashSet<String> markerIdSet=new HashSet<>();

@Override
public boolean onMarkerClick(Marker marker) {
    lastClicked=marker;
    if(!markerIdSet.contains(marker.getId()))
    {
        marker.showInfoWindow();
        marker.hideInfoWindow();
        Handler handler=new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                lastClicked.showInfoWindow();
            }
        },150);
        markerIdSet.add(marker.getId());
        return true;
    }
    else
    {
        marker.showInfoWindow();
        return true;
    }
}

因此,基本上,您将创建一个字符串(markerID)的 HashSet 如果HashSet不包含该标记ID,则我们将其添加到HashSet中,并调用marker.showInfoWindow();以显示信息窗口,并调用marker.hideInfoWindow();来隐藏它,然后使用Handler对象,代码执行将等待150ms,然后再次显示信息窗口调用marker.showInfoWindow();,这样您就可以从第一次单击中获得照片。

从技术上讲,您是在强制代码第一次自动两次单击每个标记。

请告诉我它是否有效。