【问题标题】:Maps v2 Info Window doesn't display when marker is touched, but does after touching invisible Info Window触摸标记时不显示 Maps v2 信息窗口,但在触摸不可见的信息窗口后显示
【发布时间】:2016-04-29 08:55:43
【问题描述】:

我目前正在显示一个标记。触摸时不显示信息窗口。我已经确认标题实际上是在标记中设置的。

但是,如果我触摸信息窗口所在的标记上方的区域,我会收到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;
    }
});

谢谢!

【问题讨论】:

  • 你设置了OnCameraChangeListener吗?如果是这样,您可以发布您的onCameraChange 代码吗?

标签: android google-maps google-maps-markers google-maps-android-api-2


【解决方案1】:

不确定您为什么会遇到此渲染问题,但我会给您一些可能会或可能不会解决它的提示。

首先你应该去掉检查地图是否准备好的 if 块,并去掉 mReloadWhenReady 标志。初始化谷歌地图的正确方法是使用地图片段中的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);
 }

【讨论】:

    【解决方案2】:

    尝试这样做:

    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
    • 嗨哈马德,我已经根据您的建议更新了原始问题,在 for 循环中添加 showInfoWindow()。这将显示信息窗口,但是我需要它仅在触摸标记时显示(这应该是标记的默认行为)。
    • 变量m 未在该范围内定义。还有,以后会有很多标记,所以marker这个变量应该用在onMarkerClick方法中。
    猜你喜欢
    • 2016-07-27
    • 2013-09-02
    • 2019-01-10
    • 2013-11-19
    • 2015-05-27
    • 2012-06-06
    • 1970-01-01
    • 2018-10-23
    相关资源
    最近更新 更多