Android OnLongClickListener未在MapView上触发

我刚刚在我正在编写的Android应用程序上的MapView上注册了一个OnLongClickListener。 但是出于某种原因,onLongClick事件不会触发。

这是我到目前为止所写的内容:

public class FriendMapActivity extends MapActivity implements OnLongClickListener { private static final int CENTER_MAP = Menu.FIRST; private MapView mapView; private MapController mapController; //... private boolean doCenterMap = true; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.friendmapview); this.mapView = (MapView) findViewById(R.id.map_view); this.mapController = mapView.getController(); mapView.setBuiltInZoomControls(true); mapView.displayZoomControls(true); mapView.setLongClickable(true); mapView.setOnLongClickListener(new OnLongClickListener() { public boolean onLongClick(View v) { //NEVER FIRES!! return false; } }); //... } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { switch (keyCode) { case KeyEvent.KEYCODE_3: mapController.zoomIn(); break; case KeyEvent.KEYCODE_1: mapController.zoomOut(); break; } return super.onKeyDown(keyCode, event); } @Override public boolean dispatchTouchEvent(MotionEvent ev) { int actionType = ev.getAction(); switch (actionType) { case MotionEvent.ACTION_MOVE: doCenterMap = false; break; } return super.dispatchTouchEvent(ev); } ... } 

可能覆盖我正在添加导致问题? 有什么建议么?

我刚遇到这个问题。 我尝试了上面的解决方案,但它并不是100% 完全工作,因为我们希望长按动作,即使用户仍然按住手指。

这就是我使用处理程序和延迟任务实现解决方案的方法 – 作为旁注,我使用了类似的类型实现,但相反,隐藏/显示触摸/等缩放控件。

 private Handler mHandler = new Handler(); private final Runnable mTask = new Runnable() { @Override public void run() { // your code here } }; @Override public boolean onTouchEvent(MotionEvent ev) { if (ev.getAction() == MotionEvent.ACTION_DOWN) { // record the start time, start the timer mEventStartTime = ev.getEventTime(); mHandler.postDelayed(mTask, LONG_PRESS_TIME); } else if (ev.getAction() == MotionEvent.ACTION_UP) { // record the end time, dont show if not long enough mEventEndTime = ev.getEventTime(); if (mEventEndTime - mEventStartTime < LONG_PRESS_TIME) { mHandler.removeCallbacks(mTask); } } else { // moving, panning, etc .. up to you whether you want to // count this as a long press - reset timing to start from now mEventStartTime = ev.getEventTime(); mHandler.removeCallbacks(mTask); mHandler.postDelayed(mTask, LONG_PRESS_TIME); } return super.onTouchEvent(ev); } 

与此同时,我自己找到了“解决方案”(或解决方法,随意调用)。 我解决这个问题的方法是使用GestureDetector并通过实现相应的OnGestureListener接口将所有触摸事件转发到该对象。

如果有人有兴趣,我在我的博客上发布了一些代码: http : //juristr.com/blog/2009/12/mapview-doesnt-fire-onlongclick-event/

不要直接在MapView上连接OnLongClickListener,问我为什么这不起作用。 如果有人有解释让我知道:)

更新:
我之前建议的使用GestureDetector的解决方案带来了一些缺点。 所以我更新了我网站上的博客文章。

我遇到了同样的问题,实际上你的问题有一个简单的解决方案; 这是因为你使用了错误的监听器类型。

您应该使用OnMapLongClickListener接口中的OnMapLongClickListener()对象。

希望一切都能正常运行:)请告诉我它是否有效。

在WebView框架代码中,performLongClick()用于处理长按事件,这就是Android复制文本function在浏览器中实现的方式,这就是为什么onLongClick没有被触发的原因。