views:

74

answers:

2

Hey all-

I am working on an Android app that utilizes the Google Maps API MapView, MapController, MapActivity, and ItemizedOverlay. I am basically trying to recreate certain functionalities of the Maps app (damn Google for not providing speech bubbles—for lack of a better name—for items!), particularly those speech bubbles.

I have an invisible XML structure for the speech bubble in the XML layout file containing my MapView. The first time I show a speech bubble I grab that XML and remove it from it's current parent, applying some ItemizedOverlay.LayoutParams to it, and add it to the MapView as an Overlay. I position it above the item that was selected, fill it with the proper text, then set it to visible.

This all works great. The goal here, though, is to also automatically animate the map to reveal any parts of a speech bubble that may be off-screen when it opens. So I'm trying popup.getWidth() (popup is the instance of my LinearLayout that is the speech bubble) after I do all the manipulation to the bubble, even after I display it to the user. Problem is, popup.getWidth() is returning me the width of the previously displayed popup, not the currently displayed one. I can't figure out why this would be happening if I'm fetching the width after I set it to visible with its new dimensions (which, by the way, are relative when I'm setting them with LayoutParams: fill_content for both width and height).. I have even tried forcing both the MapView and the "popup" to invalidate() before trying to fetch the width.

Any ideas why this may be happening? How can I force the View to settle into its new dimensions before trying to fetch them?

Thanks! Nick

+1  A: 

Calls like addView() and invalidate() do not happen immediately. You can think of it as if those calls create messages that go on a message queue. When you return from whatever callback you're in (e.g., onTap()), the main application thread goes back to its normal role of popping messages off that queue and processing them. Hence, the changes you are making will not take immediate effect, but only after you return.

What you can try doing is putting your logic that needs the width in a Runnable and post()-ing that Runnable. That will put it in the queue, presumably after your addView() and related stuff. At that point, when that Runnable is run, you should be able to get the correct width.

CommonsWare
Thanks so much for the info on the message queue. This really helps me to understand what is going on here. I will try your Runnable idea and see how that goes. Will post back.
Bloudermilk
Works like a charm! Thanks so much.
Bloudermilk
@Bloudermilk Knowing the width of the popup, how do you know how much of it is hidden and how do you move the map to make the entire popup visible?
kaciula
A: 

Hi Bloudermilk. Can you help me with the addition of bubble part please? i am trying to find out how to do it, but am unable to do it :(

-Kiran

Kiran Parmar