Android Google 在标记信息窗口中映射 HTML

Android Google Maps HTML in Marker InfoWindow

我目前正在解析包含坐标和 html 代码的 JSON 对象,并将它们显示在 Google 地图上 Android...到目前为止我已经这个方法:

private void createMarkersFromJson(String json) throws JSONException {
// De-serialize the JSON string into an array of objects
    JSONArray jsonArray = new JSONArray(json);
    for (int i = 0; i < jsonArray.length(); i++) {
// Create a marker for each object in the JSON data.
        JSONObject jsonObj = jsonArray.getJSONObject(i);
        mMap.addMarker(new MarkerOptions()
                        .position(new LatLng(
                                jsonObj.getDouble("lat"),
                                jsonObj.getDouble("long")
                        ))
        );
    }
}

以上代码参考:https://gist.github.com/TimPim/5902100

该方法显示标记成功。 假设在我的 JSON 对象的一部分中,我有一个名为 "contentString" 的记录,其中包含 html 代码。我想知道,我如何才能在信息 window 中正确显示它,例如 Google 在这里显示其 Javascript API:

https://developers.google.com/maps/documentation/javascript/examples/infowindow-simple

我看过这个答案并尝试自己实施但没有成功: Android Google Maps V2 Title or Snippets Strings From HTML

如果有人能向我展示更详细的解决方案以及如何将其应用于该领域,将不胜感激。

正如我所见,您可以使用 Custom info windows 换取 Android 来达到目标​​。

为此,您必须创建 InfoWindowAdapter 接口的具体实现,然后使用您的实现调用 GoogleMap.setInfoWindowAdapter()。该接口包含两个方法供您实现: getInfoWindow(Marker)getInfoContents(Marker). API 将首先调用 getInfoWindow(Marker),如果返回 null,它将调用 getInfoContents(Marker)。如果这也 returns null,则将使用默认信息 window。

详情请参考here

想通了。将 setUpMapIfNeeded 方法编辑为如下所示:

private void setUpMapIfNeeded() {
    // Do a null check to confirm that we have not already instantiated the map.
    if (mMap == null) {
        // Try to obtain the map from the SupportMapFragment.
        mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map))
                .getMap();
        // Check if we were successful in obtaining the map.
        if (mMap != null) {
            mMap.setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter() {
                @Override
                public View getInfoWindow(Marker marker) {
                    return null;
                }

                @Override
                public View getInfoContents(Marker marker) {
                    View v = getLayoutInflater().inflate(R.layout.infowindow_layout, null);
                    TextView textView = (TextView) v.findViewById(R.id.marker_label);
                    Spanned spannedContent = Html.fromHtml(marker.getTitle());
                    textView.setText(spannedContent, TextView.BufferType.SPANNABLE);
                    return v;
                }
            });
            setUpMap();
        }
    }
}

其中 marker.getTitle(),从另一个方法中的标记获取标题(其中包含我们的 html 内容)并在我们新创建的 InfoWindow 中设置文本。本教程非常有帮助:https://www.youtube.com/watch?v=g7rvqxn8SLg

我还在 res/layout 下创建了一个 infowindow_layout.xml,如下所示:

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

<LinearLayout
    android:id="@+id/station_info_layout"
    android:layout_width="205dp"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >

    <ImageView
        android:id="@+id/marker_icon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

    <TextView
        android:id="@+id/marker_label"
        android:layout_marginLeft="5dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>


</LinearLayout>

如果有人想让我澄清我的答案,请告诉我,我会编辑这个post。