地图v2信息窗口在触摸标记时不显示,但在触摸不可见的信息窗口后会显示。

6
我目前正在显示一个标记。当触摸时,信息窗口不会显示。我已确认标题实际上已在标记中设置。
但是,如果我触摸标记上方的区域,即信息窗口所在的区域,我会收到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());
    }
});

如果我在循环内部添加m.showInfoWindow();,标记将显示信息窗口;但未来会有更多的标记,因此要求仅在触摸标记时显示信息窗口。
为了调试,我添加了以下代码,并在日志中看到消息和正确的标题,但未能获得信息窗口。
map.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {

    @Override
    public boolean onMarkerClick(Marker marker) {
        L.p("marker clicked " + marker.getTitle());
        marker.showInfoWindow();
        return false;
    }
});

谢谢!


你设置了 OnCameraChangeListener 吗?如果是这样,你能发布你的 onCameraChange 代码吗? - antonio
2个回答

1

我不确定为什么您会遇到渲染问题,但我将给您一些提示,这些提示可能有助于解决问题。

首先,您应该删除检查地图是否准备好的if语句块,并且取消mReloadWhenReady标志。正确初始化Google地图的方法是使用Map片段中的getMapAsync

因此,在您的类中实现GoogleMap.OnInfoWindowClickListenerOnMapReadyCallback,并执行以下操作以初始化、设置和使用地图。

声明一个成员地图变量。

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);
 }

0

尝试这样做:

map.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {

    @Override
    public boolean onMarkerClick(Marker marker) {
        marker = m;
        L.p("marker clicked " + marker.getTitle());
        marker.showInfoWindow();
        return false;
    }
});

The method showInfoWindow() is undefined for the type MarkerOptions - zundi
嗨,Hammad,我已经按照你的建议更新了原始问题,在for循环中添加了showInfoWindow()。这将显示信息窗口,但是我需要它仅在触摸标记时显示(这应该是标记的默认行为)。 - zundi
变量 m 在该范围内未定义。另外,将来会有许多标记,因此应在 onMarkerClick 方法中使用 marker 变量。 - zundi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接