Android的 - setInfoWindowAdapter用的WebView在谷歌标记(API

2019-10-18 00:27发布

我有一个谷歌地图API V2标记问题。 我想自定义信息窗口具有的WebView:

这里我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。 我在做什么错? 非常感谢

Answer 1:

你不能直接使用的WebView。 其原因是(来源:官方文档):

注意:绘制的信息窗口不是实时取景。 该视图被呈现为图像(使用View.draw(Canvas)在它被返回的时间)。 这意味着后续的到视图的任何变化将不通过地图上的信息窗口中反映出来。 要在以后更新信息窗口(例如图像加载后),调用showInfoWindow() 另外,信息窗口将不尊重任何交互的典型为诸如触摸或手势事件正常视图。 然而,由于在下面的章节叙述,您可以收听到整个信息窗口上通用的单击事件。

您可以尝试绘制的WebView上的位图(内容已被加载后),供给ImageView与在该位图InfoWindow适配器,但你将失去交互性的网页流量反正。



Answer 2:

大量的测试,谷歌搜索和后倒车一些,我可以说你在返回视图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;
        }
    });
}

在这个例子中,我使用的片段存储网址,这不是你问什么了,但是这可能类似于。

编辑 :第一个版本被回收WebView ,但它不可能没有一些技巧,从删除Alert ,该修订版不显示InfoContents下面方框但仍然是一个问题,当按下它保持一种状态,和它认为该标记关闭对话框后点击。

您可以使用包含布局WebView来装饰了一下窗

EDIT2:恢复到像第一个版本,一个空白InfoContents框显示了位我不知道它是可以避免的。



文章来源: Android - setInfoWindowAdapter with WebView in google Marker (api v2)