如何在Google地图上的信息窗口中检测按钮setOnClickListener? 实际上在我的信息窗口我有一个按钮,我想点击该按钮。这有可能吗?
答案 0 :(得分:22)
试试吧
mMap.setOnInfoWindowClickListener(new OnInfoWindowClickListener() {
@Override
public void onInfoWindowClick(Marker marker) {
}
});
答案 1 :(得分:7)
实际上它不可行,Google地图会将您自定义InfoWindow
的内容呈现为图像,并将其作为图像显示给您。因此,您只将Click Listener设置为整个窗口,而不是其中的Views。
您唯一的选择是将ClickListener
设置为整个InfoWindow
并弹出一个包含您想要的可点击内容的对话框,而不是直接在InfoWindow
内进行。
来自Google Docs
:https://developers.google.com/maps/documentation/android/marker#info_windows
注意:绘制的信息窗口不是实时视图。观点是 在它的时候呈现为图像(使用
View.draw(Canvas)
) 回。这意味着对视图的任何后续更改都不会 通过地图上的信息窗口反映出来。更新信息窗口 稍后(例如,在图像加载后),请致电showInfoWindow()
。 此外,信息窗口不会考虑任何交互性 典型的普通视图,如触摸或手势事件。不管你 可以在整个信息窗口上收听通用点击事件 在下面的部分中描述。
答案 2 :(得分:0)
尝试创建自己的类
public abstract class OnInfoWindowItemTouchListener implements OnTouchListener {
private final View view;
private final int bgDrawableNormal;
private final int bgDrawablePressed;
private final Handler handler = new Handler();
private Marker marker;
private boolean pressed = false;
public OnInfoWindowItemTouchListener(View view, int bgDrawableNormal, int bgDrawablePressed) {
this.view = view;
this.bgDrawableNormal = bgDrawableNormal;
this.bgDrawablePressed = bgDrawablePressed;
}
public void setMarker(Marker marker) {
this.marker = marker;
}
@Override
public boolean onTouch(View vv, MotionEvent event) {
if (0 <= event.getX() && event.getX() <= view.getWidth() &&
0 <= event.getY() && event.getY() <= view.getHeight())
{
switch (event.getActionMasked()) {
case MotionEvent.ACTION_DOWN: startPress(); break;
// We need to delay releasing of the view a little so it shows the pressed state on the screen
case MotionEvent.ACTION_UP: handler.postDelayed(confirmClickRunnable, 150); break;
case MotionEvent.ACTION_CANCEL: endPress(); break;
default: break;
}
}
else {
// If the touch goes outside of the view's area
// (like when moving finger out of the pressed button)
// just release the press
endPress();
}
return true;
}
private void startPress() {
if (!pressed) {
pressed = true;
handler.removeCallbacks(confirmClickRunnable);
view.setBackgroundResource(bgDrawablePressed);
if (marker != null)
marker.showInfoWindow();
}
}
private boolean endPress() {
if (pressed) {
this.pressed = false;
handler.removeCallbacks(confirmClickRunnable);
view.setBackgroundResource(bgDrawableNormal);
if (marker != null)
marker.showInfoWindow();
return true;
}
else
return false;
}
private final Runnable confirmClickRunnable = new Runnable() {
public void run() {
if (endPress()) {
onClickConfirmed(view, marker);
}
}
};
/**
* This is called after a successful click
*/
protected abstract void onClickConfirmed(View v, Marker marker);
}
在您的活动中使用它:
final OnInfoWindowItemTouchListener buttonListener = new OnInfoWindowItemTouchListener(markHere, 0, 0) {
@Override
protected void onClickConfirmed(View v, Marker marker) {
// more code goes here
}
}
答案 3 :(得分:0)
我们实际上试图通过开发一个可以轻松创建实时(交互式)信息窗口的库来解决这个问题。
https://github.com/Appolica/InteractiveInfoWindowAndroid
我知道这是一个老问题,但我希望将来可以帮助某人。
您基本上可以使用我们库提供的管理器将您自己的片段添加为信息窗口。以下是剪辑可以轻松使用库的信息。查看上面的链接以获取更多信息
final MapInfoWindowFragment mapInfoWindowFragment =
(MapInfoWindowFragment) getSupportFragmentManager().findFragmentById(R.id.infoWindowMap);
final InfoWindow infoWindow = new InfoWindow(marker, markerSpec, fragment);
// Shows the InfoWindow or hides it if it is already opened.
mapInfoWindowFragment.infoWindowManager().toggle(infoWindow, true);