Android 信息窗口&x27;s图像在第一次单击时不显示,但在第二次单击时有效
我的android使用谷歌地图android API,InfoWindow的图像在第一次点击时不会显示,但在第二次点击时可以工作 我使用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
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;
}
}