我正在我的应用程序中实现谷歌地图。我的要求是在点击标记时显示自定义infoWindow。
我的自定义infoWindow包含一个列表视图,我需要根据点击的项目执行一些操作。
我正在获取整个infoWindow的click事件(使用OnInfoWindowClickListener),但问题是,我没有在infoWindow中获得列表视图的click事件。
根据说明here
注意:绘制的信息窗口不是实时视图。视图在返回时呈现为图像(使用View.draw(Canvas))。这意味着对视图的任何后续更改都不会被地图上的信息窗口反映出来。要稍后更新信息窗口(例如,在加载图像后),请调用showInfoWindow()。此外,信息窗口将不会考虑正常视图(例如触摸或手势事件)的任何典型交互。但是,您可以在整个信息窗口中收听通用点击事件,如以下部分所述。
那么我可以通过哪种方式获得自定义infoWindow中每个被点击项目的点击事件?
答案 0 :(得分:0)
最好的方法可能是将地图包裹在布局中。您将设置侦听器以触摸evetns,然后将事件传播到已保存的infowindows View实例。
见答案:https://stackoverflow.com/a/15040761/838424
这适用于按钮,但由于未知原因,它不适用于ListView(但传播了ListView的点击)。
<强>更新强> 因为函数 isAttachedToWindow 返回 false (在AbsListView.onTouchEvent中),点击不会传播到项目。哪个阻止处理点击事件。
解决方法是在dispatchTouchEvent
中使用包装器中的代码int pos = myListView.pointToPosition((int)copyEv.getX(),(int)copyEv.getY());
我的完整解决方法:
if (copyEv.getX() >= 0 && copyEv.getY() >= 0
&& copyEv.getX() < infoWindow.getWidth()
&& copyEv.getY() < infoWindow.getHeight())
{
// event is inside infoWindow
final int actionMasked = ev.getActionMasked();
switch (actionMasked) {
case MotionEvent.ACTION_DOWN:
int pos = vItems.pointToPosition((int)copyEv.getX(), (int)copyEv.getY());
if (pos >= 0) {
vItems.performItemClick(infoWindow, pos, 0);
ret = true;
}
break;
case MotionEvent.ACTION_UP: {
break;
}
}
}