2009-12-02 2 views
2

Я только что зарегистрировал OnLongClickListener в своем моем MapView в приложении для Android, которое я сейчас пишу. Однако по какой-то причине событие onLongClick не срабатывает.Android OnLongClickListener не стрелял по MapView

Вот что я написал до сих пор:

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); 
    } 

     ... 
} 

мая накладками, которые я добавляю причина проблемы ?? Какие-либо предложения?

ответ

2

В то же время я нашел «решение» (или обходное решение, назову его как вам нравится). Способ, которым я работал над этой проблемой, - использовать GestureDetector и перенаправить все события касания к этому объекту, реализуя соответствующий интерфейс OnGestureListener.

Я отправил некоторый код на моем блоге, если кому-то интересно: http://juristr.com/blog/2009/12/mapview-doesnt-fire-onlongclick-event/

Не спрашивайте меня, почему это не работает подключив OnLongClickListener непосредственно на MapView. Если кто-то есть объяснение, дайте мне знать :)

UPDATE:
Мой ранее предложенное решение с использованием GestureDetector позировала некоторые недостатки. Поэтому я обновил сообщение в блоге на своем сайте.

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); 
} 
0

в WebView структура кода performLongClick() используется для обработки длинный пресс-конференцию, это как Android копирования текста Функция реализована в браузере, поэтому onLongClick не был уволен.

2

Я столкнулся с той же проблемой, и на самом деле существует простое решение вашей проблемы; это потому, что вы используете неверный тип слушателя.

Вы должны использовать объект OnMapLongClickListener() с интерфейса OnMapLongClickListener.

Надеюсь, все должно работать должным образом :) Пожалуйста, сообщите мне, если это будет работать.

+0

Возможно, это то, что они представили в более поздней версии. Я не помню, чтобы я видел такое событие в то время, когда я реализовал эту функциональность. – Juri

Смежные вопросы