본문 바로가기
Android

[깡쌤의 안드로이드 프로그래밍 with 자바 - 2022 - 쌤즈] 정리 13 - 뷰 이벤트

by 들풀민들레 2022. 5. 9.

책의 모든 내용을 저자 직강으로 진행한 강의는 ssamz.com 에서 들으실 수 있습니다.

본 글은 [깡쌤의 안드로이드 프로그래밍 with 자바 - 2022 - 쌤즈] 의 내용을 발췌한 것입니다.
좀더 자세한 내용은 책 혹은 인강(www.ssamz.com)을 통해 확인해 주세요.

 

5.1. 뷰 이벤트


스마트폰 화면에서 발생하는 사용자 이벤트는 크게 두 가지로 나뉩니다. 뷰 이벤트와 터치 혹은 키
이벤트입니다. 우선 뷰 이벤트에 대해 설명해보겠습니다.


5.1.1. 이벤트 프로그램 구조


뷰 이벤트 모델은 이벤트 소스와 이벤트 핸들러를 리스너(Listener)로 연결하여 처리하는 구조입니다.

 

  • 이벤트 소스(Event Source): 이벤트가 발생한 뷰 객체
  • 이벤트 핸들러(Event Handler): 이벤트 처리 내용을 가지는 객체
  • 리스너(Listener): 이벤트 소스와 이벤트 핸들러를 연결하는 작업

 

뷰 이벤트 모델의 기본 구조는 이벤트 소스와 이벤트 핸들러를 리스너로 연결하여 처리하는 구조입니다. 그런데 화면에 보이는 뷰에서 사용자의 이벤트가 발생했다는 건 뷰에 대한 터치가 발생했다는 것이고, 그렇다면 터치 이벤트로 처리할 수 있을 텐데 왜 이런 구조로 처리하는 걸까요? 물론, 모든 뷰의 이벤트는 터치 이벤트로 처리할 수 있습니다. 그런데도
이러한 구조로 처리하는 이유는 이벤트를 조금 더 명료하게 처리하기 위해서입니다. 객체지향 프로그래밍에서의 명료성은 중요한 목적 중 하나입니다. 다음의 예로 설명해보겠습니다.

위의 화면을 어떤 알람 앱의 알람 시간 등록 화면이라고 가정해봅시다. 위에서 붉은색 네모 박스 부분만
살펴보면 많은 뷰로 구성되었는데, 이 중 총 5개의 뷰에서 사용자 이벤트가 발생합니다. 그림에서
붉은색 원으로 표시한 부분입니다. 모두 사용자가 터치했을 때 이벤트가 발생하므로 액티비티의
터치 이벤트로 처리할 수 있는데요. 문제는 이렇게 하면 5개의 뷰 중 어느 뷰가 터치된 건지 명료하지

않습니다. 개발자가 직접 알고리즘으로 해결하는 수밖에 없습니다. 또한, 터치 이벤트라도 터치한
목적은 제각각일 텐데, 모두 뭉뚱그려 터치 이벤트로 부르는 것보다는 명료하게 ClickEvent,
CheckedChangeEvent로 명명하는 게 더 좋을 것 같습니다.

 

위의 그림처럼 모두 액티비티의 터치 이벤트로 처리하지 말고, 이벤트가 발생하는 뷰를 직접 지칭하여
각 이벤트의 성격별로 이벤트 이름을 다르게 처리하면 훨씬 더 명료해집니다. 이처럼 뷰 이벤트 모델은
이벤트가 발생한 객체를 명료하게 지칭하고자 이벤트 소스를 사용하고, 이벤트 성격을 명료하게
지칭하고자 리스너를 사용합니다.

 

위의 그림처럼 vibrateCheckBox 객체에서 CheckedChangeEvent가 발생하면 어느 객체에서
이벤트가 처리된다는 것을 명료하게 연결하여 처리할 수 있습니다. 길게 설명했는데 작성하는 코드를
보겠습니다.

 

vibrateCheckView.setOnCheckedChangeListener(new MyEventHandler());

안드로이드 프로그램을 작성하다 보면 "setOnXXXListener ()"와 같은 구문을 많이 보게 되는데요.
이 부분이 이벤트 소스와 이벤트 핸들러를 리스너로 연결하는 부분입니다. 코드를 해석하자면

vibrateCheckView 객체에서 CheckedChangeEvent가 발생하면 MyEventHandler라는 클래스
객체을 실행하여 이벤트를 처리하라는 의미입니다. 이때 이벤트 핸들러로 지정한 MyEventHandler는
개발자가 만든 클래스인데, 이벤트 핸들러 클래스는 꼭 지정된 인터페이스를 구현해야 합니다.

 

class MyEventHandler implements CompoundButton.OnCheckedChangeListener{
	@Override
	public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
	
    }
}

OnCheckedChangeListener 인터페이스를 구현하고, 추상 함수를 재정의(override)하여 이벤트
처리 로직을 작성해 놓으면 실제 이벤트가 발생할 때 해당 함수가 실행됩니다

 

5.1.2. 다양한 이벤트 처리


이 책에서 지금까지는 클릭 이벤트를 이용하였지만, 안드로이드에서는 클릭 이벤트 이외에 다양한
이벤트를 제공하며 이벤트 소스인 뷰에 따라 다른 이벤트를 제공하기도 합니다. 다음의 표는 자주
사용하는 이벤트 몇 가지만 정리한 것이고, 이보다도 훨씬 더 많으며 앞으로 안드로이드 버전이
올라가면서 신규로 추가되는 뷰가 있다면 그 뷰에 맞는 이벤트가 더 추가될 수 있습니다.

 

그런데 아무리 뷰가 많고 이벤트 종류가 많다고 하더라도 뷰 이벤트 모델만 이해하면, 이벤트를
처리하는 구조는 모두 같습니다. 이벤트 소스와 이벤트 핸들러를 setOnXXXListener ( ) 함수로
연결하고, 이벤트 핸들러는 OnXXXListener를 구현해서 작성합니다.
OnClickListener는 모든 뷰에 적용할 수 있는 이벤트입니다. 대표적인 뷰가 Button이며 Button
이외에 TextView, ImageView 등 모든 뷰에 등록할 수 있습니다.

 

btn.setOnClickListener(new View.OnClickListener(){
	@Override
	public void onClick(View v) {
	
    }
});

OnLongClickListener 이벤트 역시 클릭 이벤트와 더불어 모든 뷰에 등록할 수 있습니다. 뷰를
오랫동안 눌렀을 때 발생하는 이벤트입니다 롱 클릭 이벤트를 뷰에 적용하려면 setOnLongClick
Listener ()라는 메서드를 이용합니다

 

btn.setOnLongClickListener(new View.OnLongClickListener(){
	@Override
	public boolean onLongClick(View v) {
		return false;
	}
});

OnCheckedChangeListener는 안드로이드 뷰의 이벤트 중 자주 이용되는 체크박스나 라디오버튼의
체크 상태를 변경할 때 발생하는 이벤트입니다.

 

checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
	@Override
	public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
	
    }
});

 

책의 모든 내용을 저자 직강으로 진행한 강의는 ssamz.com 에서 들으실 수 있습니다.