Java Android OnLongClickListener未在MapView上启动

Java Android OnLongClickListener未在MapView上启动,java,android,google-maps,mobile,Java,Android,Google Maps,Mobile,我刚刚在我正在编写的Android应用程序的my MapView上注册了一个OnLongClickListener。然而,由于某些原因,onLongClick事件不会触发 以下是我到目前为止所写的内容: public class FriendMapActivity extends MapActivity implements OnLongClickListener { private static final int CENTER_MAP = Menu.FIRST; privat

我刚刚在我正在编写的Android应用程序的my 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);
    }

        ...
}

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

与此同时,我自己找到了“解决方案”(或变通方法,可以随意称呼)。我解决这个问题的方法是使用一个手势检测器,并通过实现一个PredureListener接口将所有触摸事件转发给该对象

如果有人感兴趣,我已经在我的博客上发布了一些代码:

不要问我为什么在MapView上直接连接OnLongClickListener不起作用。如果有人有解释,请告诉我:)

更新:

我以前建议的使用手势检测器的解决方案有一些缺点。所以我更新了我网站上的博文。

我遇到了这个问题。我尝试了上面的解决方案,但它并没有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);
}
private Handler mHandler=new Handler();
私有最终可运行mTask=新可运行(){
@凌驾
公开募捐{
//你的代码在这里
}
};
@凌驾
公共事件(MotionEvent ev){
if(ev.getAction()==MotionEvent.ACTION\u向下){
//记录开始时间,启动计时器
mEventStartTime=ev.getEventTime();
mHandler.postDelayed(mTask,长按时间);
}else if(ev.getAction()==MotionEvent.ACTION\u UP){
//记录结束时间,如果时间不够长,则不显示
mEventEndTime=ev.getEventTime();
if(MEVENTNDTIME-mEventStartTime<长按时间){
mHandler.removeCallbacks(mTask);
}
}否则{
//移动、平移等由你决定你是否愿意
//将此计算为从现在开始的长按重置计时
mEventStartTime=ev.getEventTime();
mHandler.removeCallbacks(mTask);
mHandler.postDelayed(mTask,长按时间);
}
返回super.onTouchEvent(ev);
}

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

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

您应该使用
OnMapLongClickListener
界面中的
OnMapLongClickListener()
对象

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

也许这是他们在更高版本中引入的东西。我不记得在我实现这个功能的时候见过这样的事件。