본문 바로가기

소프트웨어/Android/Java/Ndk

Android] View 컴포넌트끼리의 Touch,Click Event 우선순위 문제



음..

위의 그림처럼 레이아웃이 있고 그 위에 버튼 컴포넌트가 있는 상황에서

Layout에 onTouchListener를 먹이고

btn에 onClickListener를 먹인 상황을 생각해자.



layout에 터치를 하고 움직였을때는 터치이벤트가 정상적으로 반응한다.

그러나 터치의 시작점을 btn으로 잡았을때는 사용자가 터치한 view가 layout이 아니기때문에 터치이벤트가 먹지 않게된다.


이렇게 되면 버튼 하나일때는 신경이 쓰이지 않을수도 있지만, 그리드뷰와같이 버튼이 엄청 많이 들어간 layout 구조라면 어디를 클릭했을때는 뷰플리퍼가 넘어가고 어디는 안넘어가고 하는 문제가 발생할것이다.






그래서 이 문제를 해결하기 위해 btn쪽에서 onTouchListener를 먹였다.

그래서 터치 시작점이 btn이라면 해당 리스너가 값을 읽고 로그를 출력하게 만들었다.

이 때에는 layout에 먹인 onTouchListener와 독립적으로(중복되지않게) 동작하기때문에 위에서 발생한 문제를 해결할 수 있었다.


그런데 여기서 중요한것은 빨간색으로 네모친 리턴값이다.

+onTouch의 return 값이 true이면 중복된 onClickListener의 +onClick 이벤트를 먹어버린다.

아마 Touch의 Rising Event의 우선순위가 Click의 Rising Event의 우선순위보다 높아져서 그러는 것 같다.

그래서 btn쪽에서는 Click Event도 받아야 하기 때문에 return값을 false로 줘서 Touch Event에서 ACTION_DOWN과 ACTION_MOVE는 받겠지만, ACTION_UP은 체크하지 않겠다! 라는 것을 알려주었다.


이렇게 하면 버튼 컴포넌트에서도 터치가 일어나게 할 수 있다.

그런데 이 방식은 오내지 약간 돌아간 방식인것 같고, api상에서 이 문제를 해결할 수 있는 방법을 제시해 놓았을것 같은 느낌이다...혹시 아는분은 댓글로좀..


끗!