Android :: OnTouchListener && Проблема с комбинацией OnClickListener

Описание проблемы:

У меня есть TextView на RelativeLayout и я хочу покрасить его красным, когда пользователь коснется его, и перейдите на другую страницу, когда он нажмет на нее. Поэтому я попытался установить OnClickListener чтобы сделать клик, и OnTouchListener для реализации сенсорной функции ( MotionEvent.ACTION_DOWN ), но эта комбинация не работает, потому что OnTouchListener делает OnClickListener нефункциональным (не знаю почему).

На форумах люди говорят, что мы можем реализовать OnClick с помощью OnTouch MotionEvent.ACTION_UP , но этот может быть запущен из моего макета TextView (TextView будет нажат, если вы нажмете его и вытащите из него свой палец для его выпуска), и это Не является желаемым поведением, потому что я хочу:
Нажмите = нажмите + выпустить на TextView.

Может ли кто-нибудь дать мне решение для этого, пожалуйста?

Вы можете вызвать View.performClick (), когда action_up. Надеюсь, поможет.

 your_txtView.setOnClickListener(new TextView.OnClickListener(){ public void onClick(View v) { // TODO Auto-generated method stub } }); your_txtView.setOnTouchListener(new TextView.OnTouchListener(){ @Override public boolean onTouch(View v, MotionEvent event) { if (MotionEvent.ACTION_DOWN == event.getAction()) { } else if (MotionEvent.ACTION_UP == event.getAction()) { v.performClick(); } return true; } }); 

Adel, проблема с первым щелчком, или вы вообще не получаете клика?

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

 private class CustomTouchListener implements OnTouchListener { @Override public boolean onTouch(View v, MotionEvent event) { TextView tv = (TextView) v.findViewById(R.id.single_line_text); if (event.getAction() == MotionEvent.ACTION_DOWN) { tv.setTextColor(COLOR_WHEN_PRESSED); } else if (event.getAction() == MotionEvent.ACTION_UP) { tv.setTextColor(COLOR_WHEN_RELEASED); // Action of click goes here } else if (event.getAction() == MotionEvent.ACTION_CANCEL) { tv.setTextColor(COLOR_WHEN_RELEASED); // To handle release outside the layout region } return false; } } 

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

Вы также должны установить ниже на своем макете

 android:focusable="true" android:focusableInTouchMode="true" android:clickable="true" 

Надеюсь, поможет!!!

EDIT: Кроме того, должен быть флаг как в DOWN, так и в UP. Установите его в DOWN и проверьте, установлен ли его в UP. Это позволит избежать ошибок, при которых пользователь может нажимать в любом месте экрана, а затем наводить курсор на текстовое представление и отпускать его.

Была та же проблема. Решила его, вернув false из ACTION_MOVE. Я сражался с ним несколько часов, пытаясь разными вещами, но, похоже, я продолжал игнорировать этот маленький вопрос … И теперь это имеет смысл. Когда вы возвращаете true из onTouch, дальнейшая обработка останавливается, поэтому OnClickListener не знает о каких-либо движениях и срабатывает onClick даже после того, как указатель перемещается за пределы видимости.