Android OnLongClickListener не работает на MapView - PullRequest
2 голосов
/ 02 декабря 2009

Я только что зарегистрировал OnLongClickListener на моем MapView в приложении для Android, которое я сейчас пишу. Однако по какой-то причине событие 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);
    }

        ...
}

Могут ли наложения, которые я добавляю, вызвать проблему? Есть предложения?

Ответы [ 4 ]

3 голосов
/ 22 января 2013

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

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

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

2 голосов
/ 17 февраля 2011

Я только столкнулся с этой проблемой. Я попробовал решение выше, но оно не вполне работает на 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);
}
2 голосов
/ 03 декабря 2009

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

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

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

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

0 голосов
/ 19 марта 2012

В платформе WebView код executeLongClick () используется для обработки события длинного нажатия, поэтому в браузере реализована функция копирования текста Android, поэтому onLongClick не запускается.

...