[안드로이드] UI 이벤트 처리
- 프로그래밍 정보
- 2010. 9. 15.
반응형
읽기전에 손가락 한번 클릭~ >_<
고마워요 ~ Chu ~ ♥
안드로이드의 이벤트 처리에 대한 내용입니다.
UI 이벤트 처리
어플리케이션과 사용자의 상호작용에서 이벤트 처리를 위해서는, 사용자가 사용하는 특정 뷰 객체에 이벤트를 등록하는 일이 우선되어야 합니다. 뷰 또는 뷰 클래스에서 이벤트 처리를 위한 public 메소드 몇가지가 제공되는데요, 이 메소드는 액션이 발생할때 시스템에 의해 호출됩니다.
뷰가 터치되면 시스템은 onTouchEvent() 메소드가 그 객체에서 호출됩니다.
하지만 이벤트 처리를 위해 해당 클래스를 상속하여 메소드를 오버라이드 해야되는데, 단순히 이벤트 처리만을 위해 모든 뷰 클래스가 상속받아야되는 상황은 번거롭게 느껴집니다. 이런 문제점 때문에 '이벤트 리스너' 라는 인터페이스를 제공하여 이벤트 처리를 쉽게 할 수 있습니다.
대부분의 이벤트 처리엔 이벤트 리스너를 사용하겠지만, 뷰 클래스를 상속해야만 하는 경우 ( 커스텀 버튼을 만들때 버튼 클래스를 상속하는 경우 등 ) 에는 '이벤트 핸들러' 클래스를 이용하여 이벤트 동작을 정의할 수 있습니다.
이벤트 리스너 ( event Listener )
이벤트 리스너는 뷰 클래스 내의 인터페이스이며 이벤트 처리를 위한 메소드를 가지고 있습니다.
이 메소드는 리스너가 등록된 뷰의 아이템이 액션이 발생했을때 시스템에 의해 호출됩니다.
이벤트 리스너의 메소드들
onClick()
View.OnClickListener 의 메소드 입니다. 사용자가 아이템을 터치하거나 키나 트랙볼로 포커스된 아이템에 엔터를 눌렀을때, 트랙볼을 눌렀을때도 동일하고 , 그때 호출됩니다.
onLongClick()
View.OnLongClickListener 의 메소드입니다. 사용자가 아이템을 길게 누르거나 키로 엔터를 길게 누르거나 트랙볼을 길게 누를때 호출됩니다. 롱~ 클릭 이니까요
onFocusChange()
View.OnFocusChangeListener 의 메소드 입니다. 이것은 키나 트랙볼로 아이템을 위로 움직이거나, 그것으로 부터 벗어날때 호출됩니다.
onKey()
View.OnKeyListener 의 메소드 입니다. 사용자가 아이템을 포커스 한 뒤 키를 누르거나 놓을때 호출되지요.
onTouch()
View.OnTouchListener 의 메소드입니다. 사용자가 아이템의 경계내에서 스크린을 누르거나, 놓거나, 기타 다른 행위에 따라 일어나는 터치 이벤트가 발생할 때 호출됩니다.
onCreateContextMenu()
View.OnCreateContextMenuListener 의 메소드입니다. 이것은 길게 누르는 클릭(LongClick) 이 발생하는데, 컨텍스트 메뉴가 만들어져 있을때 호출됩니다.
☞ 이러한 메소드들 중 필요한 것을 정의하면 됩니다. 이벤트 처리를 위해 액티비티 내에서 인터페이스로 구현하거나, 이너(Inner 또는 내부) 클래스로 정의합니다. 그런 다음 메소드에 대응되는 View.set****Listener() 메소드로 전달하면 되겠네요 ㅎ
버튼 클릭 이벤트
버튼에 대한 리스너 등록을 하는 작업입니다. 좀 더 효율적인 방법으로는 리스너를 액티비티의 일부로 포함하여 구현하는 방식이 있습니다. 이렇게 하면 별도의 클래스 생성과 객체 생성을 안해도 되겠지요. 아래 처럼요..
※ 주의할 점은 onClick() 메소드는 리턴값이 없는 void 형 이라는 것입니다. 하지만 몇개의 리스너 메소드는 boolean 값을 리턴하는데, 그 이유는 그 이벤트의 특성에 따라 필요하기 때문이겠지요. 그러한 메소드들은 아래와 같습니다.
onLongClick()
해당 이벤트 처리후에 리스너 기능이 멈추어야 하면 true, 그것을 처리하지 않았거나 그 이벤트가 다른 on-click 리스너에게서 계속되어야하면 false를 리턴해야 합니다.
onKey()
해당 이벤트 처리 후 리스너 기능이 멈추어야하면 true, 처리하지 않았거나 그 이벤트가 다른 on-key 리스너에게서 계속되어야하면 false 를 리턴합니다.
onTouch()
이벤트 사용 여부를 가르키는 boolean 값을 리턴합니다. 이 이벤트는 여러개의 액션을 가질 수 있기 때문에 좀 더 중요하다 하겠습니다. 예를들어 down액션 이벤트를 받을 때 false를 리턴하면, 그 이벤트를 사용하지 않았고 이 이벤트에 들어오는 액션을 사용하지 않겠다는 의미이죠. 즉, Up 액션 이벤트 등은 그 이벤트내에서 더 이상 호출되지 않습니다.
☞ 이벤트들은 항상 현재 포커스 되어있는 뷰에 전달됩니다. 그것은 뷰 계층구조의 최상위에서 아래로 내려가면서 전달됩니다. ( 흔히 디스패치 : dispatch 된다고도 합니다 ). 만일 현재 뷰 또는 뷰 하위클래스가 포커스를 가지고 있다면, dispatchKeyEvent() 메소드를 호출하여 이벤트 전달 경로를 확인할 수도 있습니다.
또한 뷰에서 키 이벤트를 받기 위한 다른 방법은 onKeyDown() 과 onKeyUp() 을 사용하는 것으로써, 이것을 사용하면 액티비티 내부의 모든 키 이벤트를 수신할 수 있게 됩니다.
마지막으로, 안드로이드는 처음엔 이벤트가 발생하면 이벤트 핸들러를 호출합니다. 그 다음으로 그 클래스의 디폴트 핸들러를 호출하게 되죠.
따라서 이벤트 리스너에서 true 를 리턴하면, 다른 이벤트 리스너에게 이벤트 전달을 중지시키고, 기본 이벤트 핸들러 호출도 중지되게 됩니다.
결국 true 를 리턴할 때는 이벤트가 종료되는 것이 맞는지를 확인하여 적절하여 호출되도록 확인하는 것이 좋겠네요~
따라서 이벤트 리스너에서 true 를 리턴하면, 다른 이벤트 리스너에게 이벤트 전달을 중지시키고, 기본 이벤트 핸들러 호출도 중지되게 됩니다.
결국 true 를 리턴할 때는 이벤트가 종료되는 것이 맞는지를 확인하여 적절하여 호출되도록 확인하는 것이 좋겠네요~
다음 글은 이어지는 글 - 이벤트 핸들러 입니다 ^&^
관련글
반응형