【问题标题】:Android OnLongClickListener not firing on MapViewAndroid OnLongClickListener 未在 MapView 上触发
【发布时间】:2010-12-22 08:03:27
【问题描述】:

我刚刚在我正在编写的 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);
    }

        ...
}

我添加的叠加层可能会导致问题吗?有什么建议吗?

【问题讨论】:

    标签: java android google-maps mobile


    【解决方案1】:

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

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

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

    【讨论】:

    • 也许这是他们在以后的版本中引入的东西。我不记得在我实现这个功能的时候见过这样的事件。
    【解决方案2】:

    我刚刚遇到了这个问题。我尝试了上面的解决方案,但它完全无法 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);
    }
    

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        【解决方案4】:

        在WebView框架代码中performLongClick()是用来处理长按事件的,这就是Android copy Text Feature在Browser中的实现方式,这就是onLongClick没有被触发的原因。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-10
          • 1970-01-01
          • 2018-07-22
          相关资源
          最近更新 更多