我目前正在显示一个标记。触摸时,不显示信息窗口。我已经确认标题实际上是在标记中设置的。
但是,如果我触摸信息窗口所在标记上方的区域,我会收到OnInfoWindowClickListener
事件。当发生这种情况时,我打开另一个活动,当我从此活动返回时,将显示信息窗口(实际上,我可以看到它在活动开始之前显示为一瞬间)。
有关如何在触摸标记时显示信息窗口的任何提示?
这是我的相关代码:
// .... more code up here
final GoogleMap map = mMapFragment.getMap();
if (map == null) {
mReloadWhenReady = true;
return;
}
map.clear();
final TileProviderMapsV2 prov = new TileProviderMapsV2(mMapFragment.getActivity());
map.addTileOverlay(new TileOverlayOptions().tileProvider(prov));
final LatLngBounds.Builder bounds = new LatLngBounds.Builder();
final Map<Marker, MyNode> markerMap = J.newHashMap();
mNodes.clear();
mNodes.addAll(nodes);
L.p("Maps v2 nodes: %d. ", mNodes.size());
for (MyNode node : mNodes) {
final LatLng latlng = new LatLng(node.getLat(), node.getLon());
final MarkerOptions opts = new MarkerOptions()
.position(latlng)
.title("Title is " + node.getName())
.icon(BitmapDescriptorFactory
.fromResource(com.mydomain.droid.R.drawable.pin_blue));
final Marker m = map.addMarker(opts);
markerMap.put(m, node);
bounds.include(latlng);
}
map.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener() {
@Override
public void onInfoWindowClick(Marker marker) {
final MyNode node = markerMap.get(marker);
L.p("Maps v2 Clicked Node: %s/%d. ", node.getName(),node.getId());
ViewNode.Launchr.setNodeId(node.getId()).launch(mMapFragment.getActivity());
}
});
如果我在for循环中添加m.showInfoWindow();
,标记将显示信息窗口,但将来会有更多标记,因此要求只显示信息触摸标记时的窗口。
出于调试目的,我添加了以下代码,我在日志中看到了消息以及正确的标题,但我没有收到信息窗口:
map.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
@Override
public boolean onMarkerClick(Marker marker) {
L.p("marker clicked " + marker.getTitle());
marker.showInfoWindow();
return false;
}
});
谢谢!
答案 0 :(得分:1)
不确定为什么会遇到此渲染问题,但我会给您一些可能会或可能不会解决此问题的提示。
首先,你应该摆脱if块,检查地图是否准备就绪,并摆脱mReloadWhenReady标志。初始化Google地图的正确方法是使用地图片段中的getMapAsync
。
在您的班级中实施GoogleMap.OnInfoWindowClickListener
和OnMapReadyCallback
并执行以下操作以初始化,设置和使用地图。
声明成员地图变量
private GoogleMap map = null;
然后你班级的某个地方初始化那个地图
mMapFragment.getMapAsync(this);
然后在那些覆盖方法中编写一些代码
@Override
public void onMapReady(GoogleMap googleMap)
{
//here you can be sure the map is initialized correctly
this.map = googleMap;
//here we set the info window listener
map.setOnInfoWindowClickListener(this);
setupMap() //your custom method for doing whatever you want to do with the map see below
}
//Do your stuff on onInfoWindowClick as usual
@Override
public void onInfoWindowClick(Marker marker) {
final MyNode node = markerMap.get(marker);
L.p("Maps v2 Clicked Node: %s/%d. ", node.getName(),node.getId());
ViewNode.Launchr.setNodeId(node.getId()).launch(mMapFragment.getActivity());
}
private void setupMap()
{
map.clear();
final TileProviderMapsV2 prov = new TileProviderMapsV2(mMapFragment.getActivity());
map.addTileOverlay(new TileOverlayOptions().tileProvider(prov));
final LatLngBounds.Builder bounds = new LatLngBounds.Builder();
final Map<Marker, MyNode> markerMap = J.newHashMap();
mNodes.clear();
mNodes.addAll(nodes);
L.p("Maps v2 nodes: %d. ", mNodes.size());
for (MyNode node : mNodes) {
final LatLng latlng = new LatLng(node.getLat(), node.getLon());
final MarkerOptions opts = new MarkerOptions()
.position(latlng)
.title("Title is " + node.getName())
.icon(BitmapDescriptorFactory
.fromResource(com.mydomain.droid.R.drawable.pin_blue));
final Marker m = map.addMarker(opts);
markerMap.put(m, node);
bounds.include(latlng);
}
答案 1 :(得分:0)
尝试这样做:
map.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
@Override
public boolean onMarkerClick(Marker marker) {
marker = m;
L.p("marker clicked " + marker.getTitle());
marker.showInfoWindow();
return false;
}
});