我正在开发一款利用Google Maps API MapView,MapController,MapActivity和ItemizedOverlay的Android应用。我基本上试图重新创建地图应用程序的某些功能(该死的谷歌没有提供语音泡沫 - 缺少一个更好的名称项目!),特别是那些语音泡沫。
我在包含MapView的XML布局文件中有一个不可见的XML结构。我第一次显示一个语音气泡时,我抓住那个XML并从它的当前父项中删除它,将一些ItemizedOverlay.LayoutParams应用到它,然后将它作为叠加层添加到MapView中。我将它放在所选项目的上方,用正确的文本填充,然后将其设置为可见。
这一切都很棒。不过,这里的目标是自动为地图设置动画,以显示语音气泡在打开时可能在屏幕外的任何部分。所以我正在尝试popup.getWidth()(popup是我的LinearLayout的实例,即语音气泡),即使我将其显示给用户后,我对泡泡进行了所有操作。问题是,popup.getWidth()返回先前显示的弹出窗口的宽度,而不是当前显示的弹出窗口的宽度。我无法弄清楚为什么会发生这种情况,如果我在之后获取宽度我用它的新尺寸将其设置为可见(顺便说一下,当我设置它们时它们是相对的使用LayoutParams:宽度和高度的fill_content)..我甚至试图在尝试获取宽度之前强制MapView和“popup”使invalidate()无效。
为什么会发生这种情况的任何想法?在尝试获取视图之前,如何强制视图进入新维度?
谢谢! 尼克
答案 0 :(得分:1)
addView()
和invalidate()
等通话不会立即发生。您可以将其视为这些调用创建消息队列中的消息。当您从所处的回调中返回时(例如,onTap()
),主应用程序线程将恢复其正常角色,即从该队列中弹出消息并处理它们。因此,您所做的更改不会立即生效,只有在您返回后才会生效。
您可以尝试做的是将您需要宽度的逻辑放在Runnable
和post()
中Runnable
。这会将它放入队列中,大概是在你的addView()
及相关内容之后。此时,当运行Runnable
时,您应该能够获得正确的宽度。