I have a problem which has been driving me mad for days – I’ve trawled the Web but can’t find the answer to what must be a simple problem.
I am writing an Android application which uses a map to display pins at specific locations. When the user taps one of the pins I’d like to display an info window with some additional details. Simple!
I have a class that extends MapActivity (and contains a MapView) and another that extends Overlay (note that I’m not using ItemizedOverlay due to the number of pins and performance was far too slow). In the Overlay class there is a hit testing routine which determines whether the user tapped on a pin or not and if so will display a simple rectangle above the pin with the details. It all works fine but does not look that great.
I want to display a nice speech-bubble callout which in time will also contain a button or two to perform additional operations. After a lot of looking around I found this blog post and it seemed to fit the bill. The post highlights the fact that the MapView that I have placed on my MapActivity is a ViewGroup so can contain additional views, i.e. one that represents my speech-bubble callout. However, while I can follow the partial source code I’m having problems wiring it up – that’s where I need some help.
I’ve created my 9patch image and a layout to contain it and, as a test, if I put the code in the MapActivity class then I can get the callout to display. The issue is that I need to be able to determine which pin the user has tapped so that I can get the coordinates and the associated information and this is handled by the Overlay.
So, how do I wire this up so that when a user taps a pin on the Overlay the MapActivity is called to add the new ‘Callout view’ to the MapView in the appropriate location with the associated text?
Update:
Well I took a bit more time to look at the sample project cited in the blog post I refer to above and now have a working implimentation. I had previously dismissed this as it was using the ItemizedOverlay but the approach was sound enough. Basically I’ve revised my Overlay class to accept the MapView as a parameter in the constructor so now I have access to it without having to call back down to the MapActivity. It sounds simple enough but I was trying to leave the Overlay to do what it needs to do, i.e. display the markers, and not have to tinker with the parent MapView. Fact is that it works now and I can get on with the rest of the coding.
I am not sure of what exactly you are looking for. You can find a good tutorial to figure out which point as been hit during onTap and then retrieve the overlay and print out some stuff on the map.
To display the information on fix location you could put all your info components in place in your xml with visibility invisible and change it to visible if an overlay has been touched.
Hope this helps,
Stéphane