Ответ 1
Проблема заключается в порядке операций для того, как Android обрабатывает события касания. Каждое событие касания следует шаблону (упрощенный пример):
- Activity.dispatchTouchEvent()
- ViewGroup.dispatchTouchEvent()
- View.dispatchTouchEvent()
- View.onTouchEvent()
- ViewGroup.onTouchEvent()
- Activity.onTouchEvent()
Но события следуют за цепочкой, пока не будут потреблены (это означает, что кто-то возвращает true из onTouchEvent()
или слушателя). В случае, когда вы просто касаетесь где-то на экране, никто не заинтересован в событии, поэтому он полностью переносится на ваш код. Однако в случае кнопки (или другого кликабельного View
) он потребляет событие касания, потому что оно его интересует, поэтому поток останавливается в строке 4.
Если вы хотите отслеживать все касания, которые входят в вашу активность, вам необходимо переопределить dispatchTouchEvent()
, так как то, что всегда вызывается первым, onTouchEvent()
для Activity получает последний вызов, и только если никто не зафиксировал событие. Будьте осторожны, чтобы не потреблять здесь события, или детские представления никогда не получат их, и ваши кнопки не будут доступны.
public boolean dispatchTouchEvent(MotionEvent event) {
int eventaction=event.getAction();
switch(eventaction) {
case MotionEvent.ACTION_MOVE:
reg.setText("hey");
break;
default:
break;
}
return super.dispatchTouchEvent(event);
}
Другим вариантом было бы поместить ваш код обработки прикосновений в пользовательский ViewGroup
(например, LinearLayout
) и использовать его метод onInterceptTouchEvent()
, чтобы позволить родительскому представлению украсть и обработать события касания, когда это необходимо. Однако будьте осторожны, так как это взаимодействие не может быть отменено до тех пор, пока не начнется новое событие касания (как только вы украдете одно событие, вы украдите все).
НТН