如何在更新之前检查Google Maps InfoWindow是否仍然显示?

时间:2012-12-06 14:34:48

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

我开始研究在InfoWindow中显示位置图像的InfoWindowAdapter。我有很多不同的位置,因此有可能手机上没有位置图像,而是从网上下载。

现在Maps API声明了以下内容:

  

请注意,将返回返回视图的快照,然后在地图上呈现,以便后续对视图的更改不会被地图上的信息窗口反映出来。要更新信息窗口(例如,在加载图像之后),只需调用showInfoWindow()并更新视图。

据我所知,我需要跟踪创建我想要更新的信息窗口的标记,并在加载图像后调用showInfoWindow。我有一个ImageDownloadService,它将采用一个处理程序,如果图像加载完成则通知Handler。

如果图像加载时间稍长,则用户可能会打开另一个InfoWindow或关闭当前窗口滚动。问题是,当我再次在标记上调用showInfoWindow来更新视图时,我无法确定InfoWindow是否仍然显示。

有没有办法只在仍然显示InfoWindow的情况下更新它?

2 个答案:

答案 0 :(得分:6)

我在AsyncTask下载和更新InfoWindow时遇到了类似的问题,并且在今天早上我的头撞到了墙上之后,我已经想到了这个问题。很有用的解决方法,希望能够满足您的需求,直到Google对此进行排序。

我在我marker.showInfoWindow()的{​​{1}}方法中调用了OnPostExecute(),该方法重新调用了AsyncTask方法,这些方法在循环中结束,从不传播我的InfoWindowAdapter方法正确改变。

我使用的解决方案是存储当前选择的标记和我想要显示的InfoWindow视图。我在TextView DownloadBubbleInfo上更新了AsyncTask的示例,我已经知道了这一点(类似于我认为的图像主题)。

            // Setting a custom info window adapter for the google map
        gMap.setInfoWindowAdapter(new InfoWindowAdapter() {

            // Use default InfoWindow frame
            public View getInfoWindow(Marker arg0) {
                return null;
            }

            // Defines the contents of the InfoWindow
            public View getInfoContents(Marker arg0) {
                if (selectedMarker.isInfoWindowShown()) {
                    return infoWindowView;
                } else {
                    // Getting view from the layout file info_window_layout
                    infoWindowView = getLayoutInflater().inflate(
                            R.layout.bubblewindowlayout, null);
                    // Stash the base view in infoWindowView
                    // Getting reference to the TextView to set latitude
                    TextView tvTit = (TextView) infoWindowView
                            .findViewById(R.id.tv_title);
                    tvTit.setText("Fetching data...");

                    // Async the update so we're not slowed down waiting for
                    // the
                    // bubble to populate
                    new DownloadBubbleInfo(context, infoWindowView, arg0)
                            .execute(arg0.getTitle(), arg0.getSnippet());

                    // Returning the view containing InfoWindow contents
                    return infoWindowView;
                }
            }
        });
        gMap.setOnMarkerClickListener(new OnMarkerClickListener() {

            public boolean onMarkerClick(Marker marker) {
                // When a marker is clicked set it as the selected marker so
                // we can track it for the InfoWindow adapter. This will
                // make sure that the correct marker is still displayed when
                // the callback from DownloadBubbleInfo is made to
                // marker.showInfoWindow() which is needed to update the
                // InfoWindow view.
                selectedMarker = marker;
                infoWindowView = null;
                return false;
            }
        });

来自DownloadBubbleInfo AsyncTask的相关行:

    @Override
protected String[] doInBackground(String... queryparts) {
    // Do the query and stash the results in queryResults and pass to
    // onPostExecute to attach to the mainview (the current view from the
    // main code) and then call showInfoWindow on the marker to re-launch
    // the InfoWindowAdapter methods again to repopulate the InfoWindow view
    // and attach it.
    return queryResults;
}
protected void onPostExecute(String[] results) {
    ((TextView) mainview.findViewById(R.id.tv_title)).setText(results[0]);
    ((TextView) mainview.findViewById(R.id.tv_info)).setText(results[1]);

    marker.showInfoWindow();
    Log.i("Chris-Debug", "Reshowing InfoWindow");
}

现在,所有这一切都应该确保使用从AsyncTask返回的正确信息填充正确的标记,并且他们已经成功环绕了极其笨拙的GoogleMaps v2 for Android API的另一个角落!

答案 1 :(得分:3)

Might Marker的布尔isInfoWindowShown()方法可以满足您的要求吗?

Marker#isInfoWindowShown() - Google Maps Android API v2 documentation

当InfoWindow被滚动时,它无法帮助,但是,我认为,您可能必须将Marker的LatLng坐标转换为屏幕坐标,或者使用它来检查标记是否仍在屏幕上:

How to get Latitude/Longitude span in Google Map V2 for Android

我不确定是否可以检查窗口本身是否仍处于地图视图范围内。