1

我对谷歌地图 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用于渲染为 aBitmap然后隐藏。然后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没有一些技巧将其从关闭对话框后单击标记。AlertInfoContents

您可以使用包含 a 的布局WebView来装饰窗口

Edit2:恢复到第一个版本,一个空白InfoContents框显示位我不确定它是否可以避免。

于 2014-03-13T05:50:28.593 回答