In part of my method, I configure infocontents to get html content from the marker's "title" and display this in the infowindow. I also make the window a clickable link. I am using Android-Maps-Extensions to cluster the markers.
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();
}
}
}
When I press on an individual marker, it shows the infowindow just fine (like before I added the ClusterSettings and setClustering code). However, when I press on a cluster, I get this exception:
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$1.getInfoContents(MapsActivity.java:81)
at com.androidmapsextensions.impl.DelegatingGoogleMap$DelegatingInfoWindowAdapter.getInfoContents(DelegatingGoogleMap.java:414)
at com.google.android.gms.maps.GoogleMap$13.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)
It seems like when I press on the cluster, it calls on the infocontent and infowindow. Is there anyway I can disable the infowindow for the actual clusters and just have it zoom in when the cluster is pressed?
Please comment below if you need more clarification or if you would like more information.
Edit: Solved thanks to MaciejGórski. I changed getInfoContents method to this so that I would not get an error:
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;
}
});
Cluster markers have no title by default. You are getting NPE, because you send null to Android code that expects some non-null value.
You may want to generate title for them in a different way, e.g. by iterating over all markers in a cluster:
See relevant code in demo app: DemoFragment.java.