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。
我目前正在解析包含坐标和 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。