Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 信息窗口&x27;s图像在第一次单击时不显示,但在第二次单击时有效_Android_Google Maps_Google Maps Markers_Infowindow - Fatal编程技术网

Android 信息窗口&x27;s图像在第一次单击时不显示,但在第二次单击时有效

Android 信息窗口&x27;s图像在第一次单击时不显示,但在第二次单击时有效,android,google-maps,google-maps-markers,infowindow,Android,Google Maps,Google Maps Markers,Infowindow,我的android使用谷歌地图android API,InfoWindow的图像在第一次点击时不会显示,但在第二次点击时可以工作 我使用 void setMapInfoWindow(){ mMap.setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter() { @Override public View getInfoWindow(Marker arg0) { return null

我的android使用谷歌地图android API,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();
}

首先,您可以创建一个自定义回调类来实现
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;
第三,实现
公共视图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;
   }

您也可以访问以获取完整的实施。

我认为谷歌一直在倾听,以下是适合我的解决方案。在设置集群时

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;
}
private GoogleMap.OnMapLoadedCallback mOnMapLoaded=()->{
LogUtil.i(标记“映射已加载”);
showInfoWindow();
};
私有布尔值showInfoWindow(){
选择的最终工作头=mWorkContainer.getSelectedHeader();
集合标记=mClusterManager.getMarkerCollection().getMarkers();
用于(标记:标记){
if(marker.getTitle().contains(selected.siteName)){
if(marker.getTitle().contains(selected.siteAddress)){
mClusterManager.onMarkerClick(marker);
返回true;
}
}
}
返回false;
}

我在使用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;
    }
}
private标记;
私有HashSet markerIdSet=新HashSet();
@凌驾
公共布尔onMarkerClick(标记){
最后单击=标记;
如果(!markerIdSet.contains(marker.getId()))
{
marker.showInfoWindow();
marker.hideInfo窗口();
Handler=newhandler();
handler.postDelayed(新的Runnable(){
@凌驾
公开募捐{
lastClicked.showInfoWindow();
}
},150);
markerIdSet.add(marker.getId());
返回true;
}
其他的
{
marker.showInfoWindow();
返回true;
}
}
因此,基本上您将创建字符串(markerID)的哈希集 如果HashSet不包含该标记id,那么我们将其添加到HashSet中,并调用
marker.showInfoWindow()
显示信息窗口和
标记.hideInfo窗口()
要隐藏它,然后使用Handler对象,代码执行将等待150ms,然后显示调用
marker.showInfoWindow()的infowindow再次执行此操作,您将从第一次单击中获得照片

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


请让我知道它是否有效。

因此,如果您使用毕加索库,图像将在第一次单击时显示,对吗?不,它将在第二次单击时显示使用毕加索库我通过[此解决方案][1]解决了此问题,谢谢。[1] :当调用“onSuccess”时,它将导致整个应用程序停止在“showInfoWindow”功能(而不是崩溃),并且它无法执行任何操作。我从“onSuccess”函数中删除了“showInfoWindow”,它可以工作(但我的问题仍然存在)。你说的“停止”是什么意思?你的日志里有什么东西吗?还是在onSuccess方法中设置了断点?另外,所有标记是否都放在同一位置?您可以尝试在每个位置放置一个标记,然后查看图像是否显示?我的标记位于不同的位置。“停止”是指整个屏幕停止,在信息窗口显示的时刻停止,我不能触摸任何其他标记,在显示系统消息之前不能触摸整个屏幕。。“应用程序将关闭(中文)”。这可能不是一个好方法,它会在每次单击标记时调用
showInfoWindow()
方法两次。此外,如果您试图下载一个大图像,下载可能需要2秒钟以上,因此
postDelayed
仍将不显示图像。
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;
    }
}