Android-Maps-Extensions InfoContents 生成异常
Android-Maps-Extensions InfoContents Generating Exception
在我的方法的一部分中,我将信息内容配置为从标记的 "title" 中获取 html 内容并将其显示在信息 window 中。我还使 window 成为可点击的 link。我正在使用 Android-Maps-Extensions 对标记进行聚类。
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))
.getExtendedMap();
// 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;
}
});
mMap.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener() {
@Override
public void onInfoWindowClick(Marker marker) {
int firstindex = marker.getTitle().indexOf("href=")+5;
int lastindex = marker.getTitle().indexOf("target='_blank'");
String s = marker.getTitle().substring(firstindex,lastindex);
Log.d("myapplication", s);
Uri uri = Uri.parse(s);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
}
});
ClusteringSettings clusteringSettings = new ClusteringSettings();
mMap.setClustering(clusteringSettings);
setUpMap();
}
}
}
当我按下单个标记时,它会显示信息window 就好了(就像我添加 ClusterSettings 和 setClustering 代码之前一样)。然而,当我按下一个集群时,我得到了这个异常:
01-08 15:00:20.210 3384-3384/com.example.ron.myapplication E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.NullPointerException
at java.io.StringReader.<init>(StringReader.java:46)
at android.text.HtmlToSpannedConverter.convert(Html.java:411)
at android.text.Html.fromHtml(Html.java:139)
at android.text.Html.fromHtml(Html.java:102)
at com.example.ron.myapplication.MapsActivity.getInfoContents(MapsActivity.java:81)
at com.androidmapsextensions.impl.DelegatingGoogleMap$DelegatingInfoWindowAdapter.getInfoContents(DelegatingGoogleMap.java:414)
at com.google.android.gms.maps.GoogleMap.g(Unknown Source)
at com.google.android.gms.maps.internal.d$a.onTransact(Unknown Source)
at android.os.Binder.transact(Binder.java:279)
at com.google.android.gms.maps.internal.p.b(SourceFile:112)
at com.google.maps.api.android.lib6.c.h.a(Unknown Source)
at com.google.maps.api.android.lib6.c.h.a(Unknown Source)
at com.google.maps.api.android.lib6.gmm6.c.h.b(Unknown Source)
at com.google.maps.api.android.lib6.gmm6.c.j.c(Unknown Source)
at com.google.maps.api.android.lib6.c.al.c(Unknown Source)
at com.google.maps.api.android.lib6.c.aj.g(Unknown Source)
at com.google.maps.api.android.lib6.c.al.h(Unknown Source)
at com.google.maps.api.android.lib6.gmm6.c.h.a(Unknown Source)
at com.google.maps.api.android.lib6.gmm6.o.aw.a(Unknown Source)
at com.google.maps.api.android.lib6.gmm6.o.bf.a(Unknown Source)
at com.google.maps.api.android.lib6.gmm6.o.be.a(Unknown Source)
at com.google.maps.api.android.lib6.gmm6.o.bx.d(Unknown Source)
at com.google.maps.api.android.lib6.gmm6.o.ak.onSingleTapConfirmed(Unknown Source)
at com.google.maps.api.android.lib6.gmm6.i.g.onSingleTapConfirmed(Unknown Source)
at com.google.maps.api.android.lib6.gmm6.i.i.handleMessage(Unknown Source)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:3687)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
at dalvik.system.NativeStart.main(Native Method)
似乎当我按下集群时,它会调用信息内容和信息window。无论如何,我可以禁用实际集群的信息window,并在按下集群时放大它吗?
如果您需要更多说明或需要更多信息,请在下方发表评论。
编辑:感谢 MaciejGórski 解决了问题。我将 getInfoContents 方法更改为此,这样我就不会收到错误:
public View getInfoContents(Marker marker) {
View v = getLayoutInflater().inflate(R.layout.infowindow_layout, null);
if (marker.isCluster()) {
return null;
}
TextView textView = (TextView) v.findViewById(R.id.marker_label);
Spanned spannedContent = Html.fromHtml(marker.getTitle());
textView.setText(spannedContent, TextView.BufferType.SPANNABLE);
return v;
}
});
簇标记默认没有标题。您收到 NPE,因为您将 null 发送到 Android 需要一些 non-null 值的代码。
您可能希望以不同的方式为它们生成标题,例如通过迭代集群中的所有标记:
if (marker.isCluster()) {
Collection<Marker> markers = marker.getMarkers();
// itarate over markers and getTitle on each
} else {
// your old code
}
查看演示应用程序中的相关代码:DemoFragment.java。
在我的方法的一部分中,我将信息内容配置为从标记的 "title" 中获取 html 内容并将其显示在信息 window 中。我还使 window 成为可点击的 link。我正在使用 Android-Maps-Extensions 对标记进行聚类。
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))
.getExtendedMap();
// 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;
}
});
mMap.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener() {
@Override
public void onInfoWindowClick(Marker marker) {
int firstindex = marker.getTitle().indexOf("href=")+5;
int lastindex = marker.getTitle().indexOf("target='_blank'");
String s = marker.getTitle().substring(firstindex,lastindex);
Log.d("myapplication", s);
Uri uri = Uri.parse(s);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
}
});
ClusteringSettings clusteringSettings = new ClusteringSettings();
mMap.setClustering(clusteringSettings);
setUpMap();
}
}
}
当我按下单个标记时,它会显示信息window 就好了(就像我添加 ClusterSettings 和 setClustering 代码之前一样)。然而,当我按下一个集群时,我得到了这个异常:
01-08 15:00:20.210 3384-3384/com.example.ron.myapplication E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.NullPointerException
at java.io.StringReader.<init>(StringReader.java:46)
at android.text.HtmlToSpannedConverter.convert(Html.java:411)
at android.text.Html.fromHtml(Html.java:139)
at android.text.Html.fromHtml(Html.java:102)
at com.example.ron.myapplication.MapsActivity.getInfoContents(MapsActivity.java:81)
at com.androidmapsextensions.impl.DelegatingGoogleMap$DelegatingInfoWindowAdapter.getInfoContents(DelegatingGoogleMap.java:414)
at com.google.android.gms.maps.GoogleMap.g(Unknown Source)
at com.google.android.gms.maps.internal.d$a.onTransact(Unknown Source)
at android.os.Binder.transact(Binder.java:279)
at com.google.android.gms.maps.internal.p.b(SourceFile:112)
at com.google.maps.api.android.lib6.c.h.a(Unknown Source)
at com.google.maps.api.android.lib6.c.h.a(Unknown Source)
at com.google.maps.api.android.lib6.gmm6.c.h.b(Unknown Source)
at com.google.maps.api.android.lib6.gmm6.c.j.c(Unknown Source)
at com.google.maps.api.android.lib6.c.al.c(Unknown Source)
at com.google.maps.api.android.lib6.c.aj.g(Unknown Source)
at com.google.maps.api.android.lib6.c.al.h(Unknown Source)
at com.google.maps.api.android.lib6.gmm6.c.h.a(Unknown Source)
at com.google.maps.api.android.lib6.gmm6.o.aw.a(Unknown Source)
at com.google.maps.api.android.lib6.gmm6.o.bf.a(Unknown Source)
at com.google.maps.api.android.lib6.gmm6.o.be.a(Unknown Source)
at com.google.maps.api.android.lib6.gmm6.o.bx.d(Unknown Source)
at com.google.maps.api.android.lib6.gmm6.o.ak.onSingleTapConfirmed(Unknown Source)
at com.google.maps.api.android.lib6.gmm6.i.g.onSingleTapConfirmed(Unknown Source)
at com.google.maps.api.android.lib6.gmm6.i.i.handleMessage(Unknown Source)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:3687)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
at dalvik.system.NativeStart.main(Native Method)
似乎当我按下集群时,它会调用信息内容和信息window。无论如何,我可以禁用实际集群的信息window,并在按下集群时放大它吗?
如果您需要更多说明或需要更多信息,请在下方发表评论。
编辑:感谢 MaciejGórski 解决了问题。我将 getInfoContents 方法更改为此,这样我就不会收到错误:
public View getInfoContents(Marker marker) {
View v = getLayoutInflater().inflate(R.layout.infowindow_layout, null);
if (marker.isCluster()) {
return null;
}
TextView textView = (TextView) v.findViewById(R.id.marker_label);
Spanned spannedContent = Html.fromHtml(marker.getTitle());
textView.setText(spannedContent, TextView.BufferType.SPANNABLE);
return v;
}
});
簇标记默认没有标题。您收到 NPE,因为您将 null 发送到 Android 需要一些 non-null 值的代码。
您可能希望以不同的方式为它们生成标题,例如通过迭代集群中的所有标记:
if (marker.isCluster()) {
Collection<Marker> markers = marker.getMarkers();
// itarate over markers and getTitle on each
} else {
// your old code
}
查看演示应用程序中的相关代码:DemoFragment.java。