我的Android使用谷歌地图android API,InfoWindow的图像在第一次点击时没有显示,但它可以在第二次点击时使用
我使用
自定义infoWindowvoid 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时,它不会显示图像;但它在第二次点击时显示。
我测试了一些情况:
showInfoWindow()
,然后将所有标记设置为hideInfoWindow()
。它有效,但有一个infoWindow无法关闭(最后一个)。由于
问题解决了: 加载时,google网络服务的图片网址似乎会更改为其他网址。
示例:
https://maps.googleapis.com/maps/api/place/photo?photoreference=
它将被谷歌改为以下网址:
所以我将布尔值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);
}
答案 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();
,这样您就可以从第一次单击中获得照片。
从技术上讲,您是在强制代码第一次自动两次单击每个标记。
请告诉我它是否有效。