Как получить на TouchEvent долгое нажатие и контекстное меню, работающее вместе?

В нашем приложении у нас есть собственное представление (которое расширяет ImageView) и в нем мы обрабатываем сенсорные события для записи данных. Я хотел добавить функциональность контекстного меню в это представление и следовал указаниям официальных документов Android.

onTouchEvent Код работает нормально сам по себе. Код контекстного меню также работает нормально. Однако, если я добавлю их обоих, код контекстного меню перестанет работать. Я обнаружил, что с добавлением обоих фрагментов кода, onCreateContextMenu никогда не вызывается, поэтому контекстное меню никогда не отображается.

Согласно моей интерпретации документации Android, возвращая false от onTouchEvent указывает на то, что событие не используется, поэтому его следует использовать для дальнейшей обработки. По какой-то причине этого здесь не происходит. Буду признателен, если кто-нибудь скажет мне, что мне не хватает. Кстати, цель - Nexus One под управлением 2.3.4 ROM.

Вот код для onTouchEvent в пользовательском представлении:

public boolean onTouchEvent(MotionEvent event) 
{
    switch (event.getAction())
    {
        case  MotionEvent.ACTION_DOWN:
            // Add event coordinates to an arraylist
            break;
    }

    return false;
}

Спасибо заранее за любую помощь.

5 ответов

Решение

Разрабатывая ответ hackbod, вы, вероятно, должны иметь в качестве последнего утверждения метода return super.onTouchEvent(event);,

Я предполагаю, что если вы не обработаете событие и не вызовете поведение View по умолчанию, то никто ничего не сделает, и ничего не произойдет.

Точка возвращаемого значения может, например, вызывать поведение по умолчанию какого-либо предка и сообщать производному классу, обработал ли предок событие или нет.

После некоторого поиска в Android Developer, обращаясь к теме, переопределяем существующий метод обратного вызова для View здесь:

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

Следовательно, основная идея возвращаемого значения состоит в том, чтобы сообщить Android, должно ли событие быть передано дочерним представлениям или нет.

НТН

Редактировать:

Что касается "указаний", которые вы упоминаете в своем комментарии, в общем (то есть, не только в Android) процесс обработки событий в пользовательском интерфейсе происходит примерно так:

В какой-то момент ваш производный пользовательский элемент управления получает событие. В вашей реализации обработчика событий вам решать, следует ли задействовать поведение вашего предка или нет. Это все, что у вас есть относительно направления наследования классов.

Затем есть другое направление, связанное с иерархией элементов управления пользовательского интерфейса. Ваш пользовательский элемент управления может содержаться в одном большем контейнере элемента управления, и ваш элемент управления может также содержать другие внутренние элементы управления (текстовые поля, кнопки,...). Что касается этого направления, если вы объявите, что не обрабатываете событие (возвращает false), тогда механизм обработки событий пользовательского интерфейса передаст блок в содержащий (?) Элемент управления (например, тот, что на вашем фоне).

Не регистрируйтесь в контекстном меню в OnCreate()сделай это в onTouch() перед возвращением правда;

registerForContextMenu(View v);
openContextMenu(View v);
return true;

Вы можете позвонить со своего длинного щелчка слушателя,

openContextMenu(View view)

http://developer.android.com/reference/android/app/Activity.html)

Возвращение false говорит родителю, что вы не использовали событие. Реализация View по умолчанию реализует обработку касаний для этого представления; если вы хотите, чтобы это выполнялось, вы должны вызвать super.onTouchEvent(event);

Я недавно столкнулся с подобной проблемой. Когда я включаю длинные кликабельные в RecyeclerViewдитя ACTION_DOWN событие не может быть получено в RecyclerView"s onTouchEvent,

Если бы я изменился на RecyclerView"s dispatchTouchEventХм, я бы работает. ACTION_DOWN событие может быть получено.

Другие вопросы по тегам