使用高德地图SDK集成地图功能,在地图上显示Marker标记点,点击设置的标记点弹出弹窗显示信息,这部分可参考我的另一篇文章,地址:https://blog.csdn.net/u013184970/article/details/84874780;今天要补充的内容是,弹出弹窗后,如果想关闭弹窗怎么办,点击地图上的其它部位关闭弹窗功能。
网上大部分的解决办法都是直接在map的setOnMarkerClickListener方法里像下面这样写(错误的):
第一种是:
aMap.setOnMarkerClickListener(new AMap.OnMarkerClickListener() {
@SuppressLint("LongLogTag")
@Override
public boolean onMarkerClick(Marker marker) {
if (marker.isInfoWindowShown()){
marker.hideInfoWindow();
}else {
marker.showInfoWindow();
}
Log.e("setOnMarkerClickListener", "Marker被点击了");
return false;//return true 的意思是点击marker,marker不成为地图的中心坐标,反之,成为中心坐标。
}
});
此时弹窗会一直显示,并没有关闭。
第二种是:
aMap.setOnMarkerClickListener(new AMap.OnMarkerClickListener() {
@SuppressLint("LongLogTag")
@Override
public boolean onMarkerClick(Marker marker) {
curShowWindowMarker = marker;
Log.e("setOnMarkerClickListener", "Marker被点击了");
return false;//return true 的意思是点击marker,marker不成为地图的中心坐标,反之,成为中心坐标。
}
});
aMap.setOnMapClickListener(new AMap.OnMapClickListener() {
@Override
public void onMapClick(LatLng latLng) {
if (curShowWindowMarker.isInfoWindowShown()){
curShowWindowMarker.hideInfoWindow();
}else {
curShowWindowMarker.showInfoWindow();
}
}
});
这种方式在点击marker的时候弹窗不能弹出,但是点击地图其他部位的时候却能弹出弹窗,再点击其他部位关闭弹窗,也不能达到想要的效果。
以上两种方法本人亲自试了都不可行, 之后自己又写了下面这种方法,亲试可行,以供需要的朋友参考:
首先设置两个全局变量:
private Marker curShowWindowMarker;
private boolean infoWindowShown = false;
然后再写Map的两个方法:
aMap.setOnMarkerClickListener(new AMap.OnMarkerClickListener() {
@SuppressLint("LongLogTag")
@Override
public boolean onMarkerClick(Marker marker) {
curShowWindowMarker = marker;
infoWindowShown = false;
Log.e("setOnMarkerClickListener", "Marker被点击了");
return false;//return true 的意思是点击marker,marker不成为地图的中心坐标,反之,成为中心坐标。
}
});
aMap.setOnMapClickListener(new AMap.OnMapClickListener() {
@Override
public void onMapClick(LatLng latLng) {
Log.e("tag","onMapClick");
Log.e("tag","curShowWindowMarker="+curShowWindowMarker.isInfoWindowShown());
//点击其它地方隐藏infoWindow
if(curShowWindowMarker.isInfoWindowShown() && !infoWindowShown){
infoWindowShown = true;
return;
}
if(curShowWindowMarker.isInfoWindowShown() && infoWindowShown){
curShowWindowMarker.hideInfoWindow();
}
}
});
如果有更好的方式欢迎探讨一下。