6

InfoWindow 内に場所の画像を表示する InfoWindowAdapter の作業を開始しました。私はさまざまな場所を持っているため、電話で場所の画像を利用できず、Web からダウンロードされる可能性があります。

現在、Maps API は次のように述べています。

返されたビューのスナップショットが取得され、マップ上にレンダリングされるため、その後のビューへの変更はマップ上の情報ウィンドウに反映されないことに注意してください。情報ウィンドウを更新するには (画像がロードされた後など)、showInfoWindow() を呼び出すだけでビューが更新されます。

これを理解しているので、更新したい情報ウィンドウを作成したマーカーを追跡し、画像が読み込まれたら showInfoWindow を呼び出す必要があります。イメージの読み込みが完了した場合に通知される Handler を取る ImageDownloadService があります。

画像の読み込みに少し時間がかかる場合は、ユーザーが別の InfoWindow を開いたか、スクロールして現在の Window を閉じた可能性があります。問題は、マーカーで showInfoWindow を再度呼び出してビューを更新するときに、InfoWindow がまだ表示されているかどうかわからないことです。

まだ表示されている場合にのみ InfoWindow を更新する方法はありますか?

4

2 に答える 2

6

私はAsyncTaskダウンロードと更新で同様の問題を抱えInfoWindowていました.

私はmymarker.showInfoWindow()のメソッドを呼び出していました。これはメソッドを再呼び出ししましたが、ループに陥り、変更が正しく反映されませんでした。OnPostExecute()AsyncTaskInfoWindowAdapter

私が使用した解決策は、現在選択されているマーカーと表示し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。Android API 用の非常に厄介な GoogleMaps v2 の別のコーナーを無事に迂回できました!

于 2013-04-15T10:50:29.057 に答える
3

Marker の boolean isInfoWindowShown() メソッドが探しているものでしょうか?

Marker#isInfoWindowShown() - Google Maps Android API v2 ドキュメント

InfoWindow がスクロールされて離れたときは役に立ちませんが、そのためには、マーカーの LatLng 座標を画面座標に変換するか、これを使用してマーカーがまだ画面上にあるかどうかを確認する必要があると思います。

Android用GoogleマップV2で緯度/経度スパンを取得する方法

ウィンドウ自体がまだマップビューの境界内にあるかどうかを確認できるかどうかはわかりません。

于 2012-12-06T17:01:04.173 に答える