Как получить на TouchEvent долгое нажатие и контекстное меню, работающее вместе? - PullRequest
2 голосов
/ 30 мая 2011

В нашем приложении у нас есть пользовательское представление (которое расширяет 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 ]

2 голосов
/ 30 мая 2011

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

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

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

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

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

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

НТН

Edit:

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

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

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

1 голос
/ 21 июня 2017

Не регистрироваться для контекстного меню в OnCreate(), сделать это в onTouch() до возврата true;

registerForContextMenu(View v);
openContextMenu(View v);
return true;
1 голос
/ 30 мая 2011

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

openContextMenu(View view)

http://developer.android.com/reference/android/app/Activity.html#openContextMenu(android.view.View)

0 голосов
/ 24 февраля 2016

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

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

0 голосов
/ 30 мая 2011

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

...