[안드로이드] UI 이벤트 처리
- 프로그래밍 정보
- 2010. 9. 15.
반응형
읽기전에 손가락 한번 클릭~ >_<
고마워요 ~ Chu ~ ♥
안드로이드의 이벤트 처리에 대한 내용입니다.
UI 이벤트 처리
어플리케이션과 사용자의 상호작용에서 이벤트 처리를 위해서는, 사용자가 사용하는 특정 뷰 객체에 이벤트를 등록하는 일이 우선되어야 합니다. 뷰 또는 뷰 클래스에서 이벤트 처리를 위한 public 메소드 몇가지가 제공되는데요, 이 메소드는 액션이 발생할때 시스템에 의해 호출됩니다.
뷰가 터치되면 시스템은 onTouchEvent() 메소드가 그 객체에서 호출됩니다.
하지만 이벤트 처리를 위해 해당 클래스를 상속하여 메소드를 오버라이드 해야되는데, 단순히 이벤트 처리만을 위해 모든 뷰 클래스가 상속받아야되는 상황은 번거롭게 느껴집니다. 이런 문제점 때문에 '이벤트 리스너' 라는 인터페이스를 제공하여 이벤트 처리를 쉽게 할 수 있습니다.
대부분의 이벤트 처리엔 이벤트 리스너를 사용하겠지만, 뷰 클래스를 상속해야만 하는 경우 ( 커스텀 버튼을 만들때 버튼 클래스를 상속하는 경우 등 ) 에는 '이벤트 핸들러' 클래스를 이용하여 이벤트 동작을 정의할 수 있습니다.
이벤트 리스너 ( event Listener )
이벤트 리스너는 뷰 클래스 내의 인터페이스이며 이벤트 처리를 위한 메소드를 가지고 있습니다.
이 메소드는 리스너가 등록된 뷰의 아이템이 액션이 발생했을때 시스템에 의해 호출됩니다.
이벤트 리스너의 메소드들
onClick()
View.OnClickListener 의 메소드 입니다. 사용자가 아이템을 터치하거나 키나 트랙볼로 포커스된 아이템에 엔터를 눌렀을때, 트랙볼을 눌렀을때도 동일하고 , 그때 호출됩니다.
onLongClick()
View.OnLongClickListener 의 메소드입니다. 사용자가 아이템을 길게 누르거나 키로 엔터를 길게 누르거나 트랙볼을 길게 누를때 호출됩니다. 롱~ 클릭 이니까요


View.OnFocusChangeListener 의 메소드 입니다. 이것은 키나 트랙볼로 아이템을 위로 움직이거나, 그것으로 부터 벗어날때 호출됩니다.
onKey()
View.OnKeyListener 의 메소드 입니다. 사용자가 아이템을 포커스 한 뒤 키를 누르거나 놓을때 호출되지요.
onTouch()
View.OnTouchListener 의 메소드입니다. 사용자가 아이템의 경계내에서 스크린을 누르거나, 놓거나, 기타 다른 행위에 따라 일어나는 터치 이벤트가 발생할 때 호출됩니다.
onCreateContextMenu()
View.OnCreateContextMenuListener 의 메소드입니다. 이것은 길게 누르는 클릭(LongClick) 이 발생하는데, 컨텍스트 메뉴가 만들어져 있을때 호출됩니다.
☞ 이러한 메소드들 중 필요한 것을 정의하면 됩니다. 이벤트 처리를 위해 액티비티 내에서 인터페이스로 구현하거나, 이너(Inner 또는 내부) 클래스로 정의합니다. 그런 다음 메소드에 대응되는 View.set****Listener() 메소드로 전달하면 되겠네요 ㅎ
버튼 클릭 이벤트
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 버튼을 만들고 | |
btn = (Button)findViewById(R.id.btn); | |
// OnClickListener 를 만들고 구현. | |
btn.setOnClickListener(new View.OnClickListener() { | |
public void onClick(View v) { | |
// 버튼 클릭시 일어날 작업 처리. | |
} | |
}); | |
} |
버튼에 대한 리스너 등록을 하는 작업입니다. 좀 더 효율적인 방법으로는 리스너를 액티비티의 일부로 포함하여 구현하는 방식이 있습니다. 이렇게 하면 별도의 클래스 생성과 객체 생성을 안해도 되겠지요. 아래 처럼요..
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class Example extends Activity | |
implements OnClickListener { | |
protected void onCreate(Bundle savedValues) { | |
// 구현부분 | |
Button button = (Button)findViewById(R.id.btn); | |
button.setOnClickListener(this); | |
} | |
public void onClick(View v) { | |
// 구현부분 | |
} | |
} |
※ 주의할 점은 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 를 리턴할 때는 이벤트가 종료되는 것이 맞는지를 확인하여 적절하여 호출되도록 확인하는 것이 좋겠네요~
다음 글은 이어지는 글 - 이벤트 핸들러 입니다 ^&^
관련글
반응형
작가 남시언님의
글이 좋았다면 응원을 보내주세요!