Intereting Posts
Как использовать onResume ()? Нет кэшированной версии com.android.tools.build:gradle:1.2.3 для автономного режима Java.lang.NullPointerException: попытка вызвать виртуальный метод 'int android.view.View.getImportantForAccessibility ()' для ссылки на нулевой объект Удаление записи из пакета (например, дополнительные функции) не работает в сочетании с кнопкой «Назад» Как избежать вложенных весов? Как нарисовать маршрут, используя разные длинные значения lat? Невозможно удалить повторяющиеся элементы из arraylist hashmap Android – выпадающий список / выбор Spinner не показывает Проблема с запуском андроида HelloTabWidget example – NullPointerException в addTab () Использовать библиотеку меток обхода в Android Studio React Native приложение не запускается при использовании applicationIdSuffix Android и Twitter4j: Обработка OAuth с помощью виджета Webview? Позиция просмотра списка меняется при прокрутке на андроиде Android, вычисляющий хэш SHA-1 из файла, самый быстрый алгоритм Возможно ли для Android VM собирать статические переменные без уничтожения всего приложения Android?

OnTouch работает, но OnClickListener этого не делает?

Я создал виджет / элемент управления, который я могу использовать повторно, создав, добавив RelativeLayout . Затем в одной из моих работ я создал кучу этих виджетов в цикле. Однако у меня возникла проблема, когда я хотел, чтобы каждый виджет ответил на щелчок.

Я обнаружил, что настройка OnTouchListener работает:

  this.setOnTouchListener(new OnTouchListener(){ public boolean onTouch(View arg0, MotionEvent arg1) { //Triggers debug message } }); 

Но OnClickListener не делает:

  this.setOnClickListener(new View.OnClickListener(){ public void onClick(View v) { //Doesn't trigger debug message } }); 

Почему это?

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

 View.setClickable() View.setEnabled() View.setFocusable() View.setFocusableInTouchMode() 

В зависимости от точного поведения, которое вы надеетесь получить, вам нужно установить одну или несколько из них. Поскольку вы получаете onTouch-события, я предполагаю, что вам нужно установитьClickable. Но мне нужно будет увидеть код создания представления.

Вы должны убедиться, что TouchListener не «поглощает» событие касания. Если вы onTouch() true из onTouch() , Android onTouch() его потребление и не передаст его другим другим обработчикам сенсорных обработок (который, как я предполагаю, будет включать ClickListener).

Ты должен сделать:

 this.setOnTouchListener(new OnTouchListener(){ public boolean onTouch(View arg0, MotionEvent arg1) { //Triggers debug message return false; } }); 

Вы правильно возвращаете значение boolean onTouch?

Из документов:

OnTouch () – возвращает логическое значение, указывающее, использует ли ваш слушатель это событие. Важно то, что это событие может иметь несколько действий, которые следуют друг за другом. Таким образом, если вы вернете false при поступлении события вниз, вы указываете, что вы не использовали это событие, а также не заинтересованы в последующих действиях этого события. Таким образом, вас не будут вызывать для каких-либо других действий внутри события, таких как жест пальца или возможное событие действия.

РЕДАКТИРОВАТЬ

Нашел решение в этом вопросе и попробовал сам.

Вам нужно использовать этот return super.onTouchEvent(event); В вашем коде onTouchEvent. После добавления этого OnClickListener начал работать.

Чтобы выполнить это возвращение false в вашем onTouch() следующим образом:

 this.setOnTouchListener(new OnTouchListener(){ public boolean onTouch(View arg0, MotionEvent arg1) { return false; } }); 

Вы можете выполнить onClickListener через onTouchListener:

 webView.setOnTouchListener(new View.OnTouchListener() { public final static int FINGER_RELEASED = 0; public final static int FINGER_TOUCHED = 1; public final static int FINGER_DRAGGING = 2; public final static int FINGER_UNDEFINED = 3; private int fingerState = FINGER_RELEASED; @Override public boolean onTouch(View view, MotionEvent motionEvent) { switch (motionEvent.getAction()) { case MotionEvent.ACTION_DOWN: if (fingerState == FINGER_RELEASED) fingerState = FINGER_TOUCHED; else fingerState = FINGER_UNDEFINED; break; case MotionEvent.ACTION_UP: if(fingerState != FINGER_DRAGGING) { fingerState = FINGER_RELEASED; // Your onClick codes } else if (fingerState == FINGER_DRAGGING) fingerState = FINGER_RELEASED; else fingerState = FINGER_UNDEFINED; break; case MotionEvent.ACTION_MOVE: if (fingerState == FINGER_TOUCHED || fingerState == FINGER_DRAGGING) fingerState = FINGER_DRAGGING; else fingerState = FINGER_UNDEFINED; break; default: fingerState = FINGER_UNDEFINED; } return false; } }); 

Если по какой-либо причине вы переопределите метод onMotionEvent (), и вам нужно вернуть true / false в этом случае, вы можете вручную вызвать обратный вызов OnClickListener (), вызвав this.performClick () внутри переопределенного onMotionEvent () непосредственно перед возвратом true /ложный.

Когда вам нужны как события onClick, так и onTouch на одном и том же представлении, используйте GestureDetector .