Android OnLongClickListener 未在 MapView 上触发
Posted
技术标签:
【中文标题】Android OnLongClickListener 未在 MapView 上触发【英文标题】:Android OnLongClickListener not firing on 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);
...
我添加的叠加层可能会导致问题吗?有什么建议吗?
【问题讨论】:
【参考方案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没有被触发的原因。
【讨论】:
以上是关于Android OnLongClickListener 未在 MapView 上触发的主要内容,如果未能解决你的问题,请参考以下文章
Android 逆向Android 权限 ( Android 逆向中使用的 android.permission 权限 | Android 系统中的 Linux 用户权限 )
Android 逆向Android 权限 ( Android 逆向中使用的 android.permission 权限 | Android 系统中的 Linux 用户权限 )