Intereting Posts
Android WebView – видео Youtube не воспроизводится в приложении Непрерывное обновление местоположения в фоновом режиме Какова наилучшая практика для размещения классов под именами пакетов в Android Android ScaleAnimation и TranslateAnimation, как избежать движения ScaleAnimation Ни пользователь, ни текущий процесс не имеют android.permission.ACCESS_COARSE_LOCATION Создание 3d-модели для просмотра андроида? Добавление файла .so в Android Studio Получите MAC-адрес устройства Android без Wi-Fi Каков самый быстрый способ загрузить 10000 строк из базы данных SQLite? Пользовательская аннотация / декоратор Java @Testing Как проверить, является ли мое приложение стандартной пусковой установкой Java / Android ждут завершения потока до запуска нового метода Изменение локализации андроидов в изменении ориентации Android-соединение Bluetooth – обнаружено обнаружение службы Android Column GridView, переменная ширина, такая как приложение GooglePlus

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 .