When using Google Map API V3 I can add custom property in the following way:
var marker = new google.maps.Marker({
position: userLocation,
map: myGoogleMap,
animation: google.maps.Animation.DROP,
icon: avatar,
title: userName,
customProperty1: bla,
customProperty2: bla,
customProperty3: bla,
...
});
I'm wondering if I can do the same for API V2 Android, the reason I want to do this is that each info window of each marker need to know some information of that marker. And I'm trying to achieve this in render
function below:
private void render(Marker marker, View view) {
int badge = R.drawable.android_face;
if (marker.customProperty)
//here I need to know this property to decide which image to use
badge = R.drawable.bla;
((ImageView) view.findViewById(R.id.badge))
.setImageResource(badge);
}
You cannot directly extend Marker
, because it is a final class, but you have some options:
0) As of Google Maps Android API v2 version 9.4.0, you can use Marker::getTag
and Marker::setTag
. This is most likely the preferred option.
1) Create a map to store all additional information:
private Map<Marker, MyData> allMarkersMap = new HashMap<Marker, MyData>();
When creating a marker, add it to this map with your data:
Marker marker = map.addMarker(...);
allMarkersMap.put(marker, myDataObj);
Later in your render
function:
MyData myDataObj = allMarkersMap.get(marker);
if (myDataObj.customProp) { ...
2) Another way would be to use Marker.snippet
to store all the info as a String
and later parse it, but that's kinda ugly and unmaintainable solution.
3) Switch from plain Google Maps Android API v2 to Android Maps Extensions.
This is very similar to point 1, but you can directly store MyData
into marker, using
marker.setData(myDataObj);
and later:
MyData myDataObj = (MyData) marker.getData();
I used Marker.setTag(Object o)
and .getTag()
to pass my custom location obj. to the Marker. Of course the Object can be any kind of object you want.
Marker m = googleMap.addMarker(new MarkerOptions()
.position( ... )
// setTag is not part of MarkerOptions so can't be defined here
);
m.setTag(location); // Marker.setTag()
And accessing that obj. in InfoWindowAdapter is easy:
@Override
public View getInfoContents(Marker marker) {
...
Object o = marker.getTag();
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With