我刚刚在我正在编写的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);
}
...
}
我正在添加的覆盖会导致问题吗?有什么建议吗?
答案 0 :(得分:3)
我遇到了同样的问题,实际上你的问题有一个简单的解决方案;它是因为您使用了错误的监听器类型。
您应该使用OnMapLongClickListener()
界面中的OnMapLongClickListener
对象。
希望一切都能正常运行:) 请告诉我它是否有效。
答案 1 :(得分:2)
与此同时,我自己找到了“解决方案”(或解决方法,随意调用)。我解决这个问题的方法是使用GestureDetector并通过实现相应的OnGestureListener接口将所有触摸事件转发到该对象。
如果有兴趣的话,我在我的博客上发布了一些代码: http://juristr.com/blog/2009/12/mapview-doesnt-fire-onlongclick-event/
不要直接在MapView上连接OnLongClickListener,问我为什么这不起作用。如果有人有解释,请告诉我:)
<强>更新强>
我之前建议的使用GestureDetector的解决方案带来了一些缺点。所以我更新了我网站上的博文。
答案 2 :(得分: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);
}