Intereting Posts
Изменение размера пути в андроидном холсте Есть ли эквивалент AppCompat Widget.Material.Spinner.Underlined? Исключение Nullpointer после удаления записи из базы данных SQL HTML5 navigator.online не работает в WebView Невозможно скомпилировать, Невозможно выполнить dex, не может объединиться, не-jumbo инструкция Предлагаемый протокол для андроид-ардуиновой связи Royalty Free Background Images для Android-приложений Андроидное программирование NameValuePair удалено для api 23 Является ли хорошей идеей инициализировать Crashlytics, в методе onCreate от android? Безопасен ли поток метода IntentService onStartCommand (..)? Facebook LoginActivity отображается неправильно Ошибка: выполнение выполнено для задачи ': app: transformClassesWithDexForDebug'. > Com.android.build.api.transform.TransformException: .. ненулевое значение выхода 3 Ошибка Android Pre Compiler? Не удалось скомпилировать шейдер, который, как известно, хорош для android Есть ли способ печати на консоль в приложении для 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 } }); 

Почему это?

Solutions Collecting From Web of "OnTouch работает, но OnClickListener этого не делает?"

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

 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 .