Reputation: 2737
I am having a map displayed with some markers which are dynamically generated based on latitude and longitude.
I am using a custom infowindow to be shown when clicked on the marker, with an ImageView and a TextView.
map.setInfoWindowAdapter(new InfoWindowAdapter() {
@Override
public View getInfoWindow(Marker marker) {
return v;
}
@Override
public View getInfoContents(Marker marker) {
v = getLayoutInflater().inflate(R.layout.info_window_layout,
null);
Bitmap myBitmap;
try {
URL url = new URL(
"URL here");
HttpURLConnection connection = (HttpURLConnection) url
.openConnection();
connection.setDoInput(true);
connection.connect();
connection.setReadTimeout(120000);
InputStream input = connection.getInputStream();
myBitmap = BitmapFactory.decodeStream(input);
} catch (IOException e) {
e.printStackTrace();
return null;
}
ImageView imgPhoto = (ImageView) v
.findViewById(R.id.imageView1);
tvPropertyID = (TextView) v.findViewById(R.id.textView1);
imgPhoto.setImageBitmap(myBitmap);
return v;
}
});
map.setOnMarkerClickListener(this);
and Dynamically placing markers like this,
protected void placeMarker(final List<PropertiesList> PropertyStub) {
for (int i = 0; i <= PropertyStub.size() - 1; i++) {
final LatLng MeanLatLng = new LatLng(PropertyStub.get(i).Latitude,
PropertyStub.get(i).Longitude);
if (!visibleMarkers.containsKey(PropertyStub.get(i).PropertyID)) {
visibleMarkers
.put(PropertyStub.get(i).PropertyID,
this.map.addMarker(new MarkerOptions()
.position(MeanLatLng)
.title("Property")
.icon(BitmapDescriptorFactory
.fromResource(R.drawable.pink_outside_marker))));
}
}
}
Here I am using hashmap to keep track of the marker which the user clicked and display Image and text accordingly based on some fields like location and PropertyID.
onMarkerClick,
View v;
public boolean onMarkerClick(Marker marker) {
Log.d("", "On marker click");
Log.d("", "VisibleMarkerText: " + visibleMarkers.get(marker));
tvPropertyID = (TextView) v.findViewById(R.id.textView1);
tvPropertyID.setText("" + visibleMarkers.get(marker));
return true;
}
I am instantiating "v" in map.setInfoWindowAdpater().
Here at this line "tvPropertyID = (TextView) v.findViewById(R.id.textView1);" it gives null pointer exception. And not only that I am getting "visibleMarkers.get(marker)" value as null.
This is my logcat,
06-18 12:39:26.812: E/AndroidRuntime(19018): FATAL EXCEPTION: main
06-18 12:39:26.812: E/AndroidRuntime(19018): java.lang.NullPointerException
06-18 12:39:26.812: E/AndroidRuntime(19018): at com.bu.PropertySearchTypes.MapSearch.onMarkerClick(MapSearch.java:230)
06-18 12:39:26.812: E/AndroidRuntime(19018): at com.google.android.gms.maps.GoogleMap$4.f(Unknown Source)
06-18 12:39:26.812: E/AndroidRuntime(19018): at com.google.android.gms.internal.bp$a.onTransact(Unknown Source)
06-18 12:39:26.812: E/AndroidRuntime(19018): at android.os.Binder.transact(Binder.java:279)
06-18 12:39:26.812: E/AndroidRuntime(19018): at bds.a(SourceFile:84)
06-18 12:39:26.812: E/AndroidRuntime(19018): at maps.aj.bk.a(Unknown Source)
06-18 12:39:26.812: E/AndroidRuntime(19018): at maps.as.d.a(Unknown Source)
06-18 12:39:26.812: E/AndroidRuntime(19018): at maps.as.p.c(Unknown Source)
06-18 12:39:26.812: E/AndroidRuntime(19018): at maps.as.o.a(Unknown Source)
06-18 12:39:26.812: E/AndroidRuntime(19018): at maps.as.bo.c(Unknown Source)
06-18 12:39:26.812: E/AndroidRuntime(19018): at maps.as.bk.onSingleTapConfirmed(Unknown Source)
06-18 12:39:26.812: E/AndroidRuntime(19018): at maps.bs.g.onSingleTapConfirmed(Unknown Source)
06-18 12:39:26.812: E/AndroidRuntime(19018): at maps.bs.i.handleMessage(Unknown Source)
06-18 12:39:26.812: E/AndroidRuntime(19018): at android.os.Handler.dispatchMessage(Handler.java:99)
06-18 12:39:26.812: E/AndroidRuntime(19018): at android.os.Looper.loop(Looper.java:130)
06-18 12:39:26.812: E/AndroidRuntime(19018): at android.app.ActivityThread.main(ActivityThread.java:3687)
06-18 12:39:26.812: E/AndroidRuntime(19018): at java.lang.reflect.Method.invokeNative(Native Method)
06-18 12:39:26.812: E/AndroidRuntime(19018): at java.lang.reflect.Method.invoke(Method.java:507)
06-18 12:39:26.812: E/AndroidRuntime(19018): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
06-18 12:39:26.812: E/AndroidRuntime(19018): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
06-18 12:39:26.812: E/AndroidRuntime(19018): at dalvik.system.NativeStart.main(Native Method)
Please any one correct me. I don't know beyond this. Any help is appreciated!!
Upvotes: 2
Views: 1512
Reputation: 1206
this is the custom info windows adopter , customize your view here and set it to you mMap
/** Demonstrates customizing the info window and/or its contents. */
class CustomInfoWindowAdapter implements InfoWindowAdapter
{
// private final RadioGroup mOptions;
// These a both viewgroups containing an ImageView with id "badge" and two TextViews with id
// "title" and "snippet".
private final View mWindow;
private final View mContents;
CustomInfoWindowAdapter()
{
mWindow = getLayoutInflater().inflate(R.layout.custom_info_window, null);
mContents = getLayoutInflater().inflate(R.layout.custom_info_contents, null);
// mOptions = (RadioGroup) findViewById(R.id.custom_info_window_options);
}
@Override
public View getInfoWindow(Marker marker)
{
// if (mOptions.getCheckedRadioButtonId() != R.id.custom_info_window)
// {
// // This means that getInfoContents will be called.
// return null;
// }
render(marker, mWindow);
return mWindow;
}
@Override
public View getInfoContents(Marker marker)
{
// if (mOptions.getCheckedRadioButtonId() != R.id.custom_info_contents)
// {
// // This means that the default info contents will be used.
// return null;
// }
render(marker, mContents);
return mContents;
}
private void render(Marker marker, View view)
{
String title = marker.getTitle();
TextView titleUi = ((TextView) view.findViewById(R.id.title));
if (title != null)
{
// // Spannable string allows us to edit the formatting of the text.
SpannableString titleText = new SpannableString(title);
// titleText.setSpan(new ForegroundColorSpan(Color.RED), 0, titleText.length(), 0);
titleUi.setText(titleText);
}
else
{
titleUi.setText("");
}
//
String snippet = marker.getSnippet();
TextView snippetUi = ((TextView) view.findViewById(R.id.snippet));
if (snippet != null)// && snippet.length() > 12)
{
SpannableString snippetText = new SpannableString(snippet);
// snippetText.setSpan(new ForegroundColorSpan(Color.MAGENTA), 0, 10, 0);
// snippetText.setSpan(new ForegroundColorSpan(Color.BLUE), 12, snippet.length(), 0);
snippetUi.setText(snippetText);
}
else
{
snippetUi.setText("");
}
}
}
set it to your map.
// Setting an info window adapter allows us to change the both the contents and look of the
// info window.
mMap.setInfoWindowAdapter(new CustomInfoWindowAdapter());
you can find example project map you SDK path >extrass > google > google_play_services > samples > maps just load it from New project > Android Project from existing Code
Upvotes: 1