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
Related
I have been trying to find a way to get this done but keep running into issues.
I want to be able to have a map in a frame (it does not necessarily have to be a FrameLayout, i just want it framed so it only takes up 1/2 or 2/3 the screen) ontop of my current layout and to have the current activity still displayed behind it.
In a perfect world, i would like to attach this view to a button and animation so clicking the button causes this view to slide in from offscreen left and settle in the center of my current activity, while still being fully clickable and and the map being useable (can zoom, click, etc.)
I have tried doing this with a fragment, but the issue is that the Activity i am working in is already extending another class that is absolutely necessary, so i can not extend Fragment or FragmentActivity, so i cant use fragments (unless i am missing a work around to achieve this.)
The same goes for MapActivity and MapView, cant extend the MapActivity class so cant use MapView.
Any time i try to inflate a map view or anything i get runtime errors because my activity does not extend the pertinent class. Is there a work around for this?
Does anyone have a suggestion as to how i can get this map to display the way i am looking for?
This is easily achieved in iOS but i cant seem to figure it out in Android.
Thank you in advance
EDIT
I am not looking for code, unless you have a specific example in which case obviously code is very helpful, but i am looking for an idea as to how to achieve this -- a push in the right direction if you will -- so i can write the code myself.
Solved this by adding a frame layout to my "Main" activity. That frame layout's class was set to my Map class. The Map class extended FragmentActivity and its contentView is set to my map_fragment.xml. The map_fragment.xml contains only a fragment and that fragments name is set to com.google.android.....SupportMapFragment.
After setting up my project in this way as well as setting up the correct screen layouts and dimensions for sizing purposes as well as defining a GoogleMap in my Map class, i was able to display a fully usable and interactive map over my "Main" activity.
I overrode some Activity transition animations to the Map class and got my project working 100% how i want it to.
I didnt ask for code, so i will not supply any code, but this process is pretty straight-forward if you follow the same process as i have described above.
In my ExpandableListView I need to add Google Map on each item.
I tried with putting Map on each item but its giving me inflate exception. And its is also stated that an MapActivity can contain only one MapView.
Is there any other idea to achieve this.
For refrence you can see here.
Your comments regarding MapActivity indicate that you are using Maps V1, which is deprecated. Maps V2 does not require a MapActivity and can have multiple maps.
That being said, your proposed implementation is unlikely to work well, as putting scrollable things in scrollable things can be problematic. It also is rather unrealisitc IMHO -- whoever came up with that design has never used an actual smartphone, as there's no point in having an interactive map that small (again, IMHO).
Consider using static maps (there's a Google API for that somewhere) for inside the ExpandableListView, where a tap on the map brings up the full map, either in your app or in the standard Maps app.
I recommend to not use static map (as for example it's not possible to zoom to particular bounds with newLatLngBounds or add a circle in particular lat/lon).
I recommend to use map fragment in lite mode:
In addition, there is also a new ‘lite mode’ map option, ideal for situations where you want to provide a number of smaller maps, or a map that is so small that meaningful interaction is impractical, such as a thumbnail in a list. A lite mode map is a bitmap image of a map at a specified location and zoom level.
Map fragment can be nested in the list.
i want to do the following. I am having a google map that displays my position. I have created separately a compass. Now what I want is to combine them and put the compass on top of my map. I do not know where to start for it, and how I skould implement it since data of te compass are also being updated every second I move?
If you have any tutorials please give me link cause I have not been able to find any.
In my previous app I have used a class extending Overlay but this was for only putting a pin or something like this.
You may add the image as a custom control: example (it's the home-button in the example)
Recently I show the ubicabs taxi booking app. I found very nice functionality inside it. In this app they have google maps for showing markers, but they have used very good UI component for that. Also I found one more uniqueness is that whenever user moves or change the position of marker through touch it will fetch the current location. One thing that I know is that it is using the onTouchEvent of Overlay but how to create that marker balloon and how to get updated location on the basis of that marker.
I am attaching a preview of that marker here. Also would like to know that how can we scroll the text inside that balloon?
The best overlay open project I have found so far is this one, link. But it is nothing compared to the picture above. Would also like to know how they created this! Great Question and picture ;)
I'm currently developing an app which uses tabs and google map. What I want to do is to get the gps positions, say 3, and store them in sql db (which I'm already doing) and then display them on the map. I already created canvas, added to overlay but those points disappear when I'm changing tabs so I thought if there is a way to somehow store those coords with google map so I can retrieve them and display them nicely whenever I'm clicking the "map tab"? Please can anyone help?
I don't have the answer for you but I know the issue is being caused by the change of view. This is the same as you get when you rotate the device and the screen resets. You need to do something with the onRestoreInstanceState(). The default of this restores the state of your UI. So you need to override it to save the data and readd it when the view changes.
Hope that helps. Someone else might have a code sample.
T
Use an ItemizedOverlay, and associate the overlay with the map in onCreate(). The overlay should not "disappear when I'm changing tabs".