1

Google Maps API v2 のマーカーに問題があります。WebView を使用して infoWindows をカスタマイズしたいと思います。

ここにInfoWindowAdapterの私のコード

    mMap.setInfoWindowAdapter(new InfoWindowAdapter() {  
        @Override
        public View getInfoWindow(Marker arg0) {
            return null;
        }
        @Override
        public View getInfoContents(Marker arg0) {
            View v = getLayoutInflater().inflate(R.layout.info_window_layout, null);
            TextView title = (TextView) v.findViewById(R.id.title_marker);
            WebView snippet = (WebView) v.findViewById(R.id.item_snippet);
            title.setText(arg0.getTitle());
        snippet.setVisibility(WebView.VISIBLE);
        snippet.loadData(arg0.getSnippet(),"text/html", "UTF-8");
            return v;

        }
    });

そして、これはレイアウトです:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/title_marker"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <WebView
        android:id="@+id/item_snippet"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

私の問題は、コンテンツが TextView に表示されますが、コンテンツが WebView に表示されないことです。私が間違っているのは何ですか?どうもありがとう

4

2 に答える 2

2

WebView を直接使用することはできません。理由は次のとおりです(出典:公式ドキュメント):

注: 描画される情報ウィンドウはライブ ビューではありません。View.draw(Canvas)ビューは、返されるときに( を使用して) イメージとしてレンダリングされます。これは、ビューに対するその後の変更がマップ上の情報ウィンドウに反映されないことを意味します。後で情報ウィンドウを更新するには (たとえば、画像が読み込まれた後)、 を呼び出しますshowInfoWindow()。さらに、情報ウィンドウは、タッチやジェスチャ イベントなど、通常のビューに典型的な対話性を考慮しません。ただし、以下のセクションで説明するように、情報ウィンドウ全体で一般的なクリック イベントを聞くことができます。

(コンテンツがロードされた後) ビットマップ上に webview を描画してImageView、アダプターでそのビットマップをInfoWindow指定することはできますが、とにかく webview との対話性が失われます。

于 2013-04-13T16:59:08.767 に答える
1

getInfoContents多くのテスト、グーグル、およびいくつかの逆転の後、あなたが戻ってきたビューはレンダリングに使用され、Bitmap次に非表示になっていると言えます。bitmapを介して表示されます。GL

あなたにぴったりの回避策を見つけました。

private View mGhost;

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    mGhost = new View(this);
    mGhost.setLayoutParams(new LayoutParams(0, 0));
    mGhost.setVisibility(View.GONE);        

    ....
}

public void onMapReady(GoogleMap map) // or whatever
{
    map.setInfoWindowAdapter(new InfoWindowAdapter()
    {
        @Override
        public View getInfoWindow(Marker marker)
        {
            return null;
        }

        @Override
        public View getInfoContents(final Marker marker)
        {
            WebView webview = new WebView(MainActivity.this);
            webview.loadUrl(marker.getSnippet());
            AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
            AlertDialog alert = builder.setView(webview).create();
            alert.show();
            alert.getWindow().setLayout(200, 200);
            mGhost.post(new Runnable()
            {
                @Override
                public void run()
                {
                    marker.hideInfoWindow();
                }
            });
            return mGhost;
        }
    });
}

この例では、スニペットを使用して URL を保存しました。質問したとおりではありませんが、似ているかもしれません。

編集: 最初のバージョンは をリサイクルしてWebViewいましたが、 からそれを削除するためのトリックがなければ不可能Alertです。この改訂版では、下のボックスは表示されませんが、InfoContentsまだ問題があります。ダイアログを閉じた後、マーカーをクリックします。

を含むレイアウトを使用してWebView、ウィンドウを少し装飾できます。

Edit2 : 最初のバージョンのようなものに戻しました。空白のInfoContentsボックスが少し表示されます。回避できるかどうかはわかりません。

于 2014-03-13T05:50:28.593 に答える