220 likes | 379 Views
Contents. 학습목표. 이벤트를 처리하는 여러 가지 형식과 각 형식의 장단점에 대해 상세하게 연구하고 기본적인 이벤트에 대한 실습을 한다 . 사용자의 입력을 자유자재로 처리하기 위해서 반드시 습득해야 하는 중요한 기술 실습. 학습내용. 이벤트 핸들러 여러 가지 이벤트. 6.1.1 이벤트 처리. GUI 환경은 비절차적이며 사용자의 입력에 반응하는 이벤트를 처리하는 식으로 코드를 작성한다 . 이벤트를 작성하는 여러 가지 방법과 문법적 변형이 존재한다 .
E N D
Contents 학습목표 • 이벤트를 처리하는 여러 가지 형식과 각 형식의 장단점에 대해 상세하게 연구하고 기본적인 이벤트에 대한 실습을 한다. • 사용자의 입력을 자유자재로 처리하기 위해서 반드시 습득해야 하는 중요한 기술 실습. 학습내용 • 이벤트 핸들러 • 여러 가지 이벤트
6.1.1 이벤트 처리 • GUI 환경은 비절차적이며 사용자의 입력에 반응하는 이벤트를 처리하는 식으로 코드를 작성한다. • 이벤트를 작성하는 여러 가지 방법과 문법적 변형이 존재한다. • 각 방법이 혼용되므로 모든 방식에 대해 익숙해질 필요가 있다. 콜백메서드 재정의 리스너 인터페이스 구현 액티비티가리스너 구현 뷰가리스너 구현 익명 이너 클래스 사용 익명 이너 클래스의 임시 객체 사용
6.1.1 이벤트 처리 – 1. 콜백메서드 재정의 • 해당 클래스를 상속 받아 콜백메서드에서 재정의 • 특정 이벤트가 발생했을 때 시스템에 의해 자동으로 호출되는 매서드. • 특정 이벤트가 발생한 시점을 정확하게 가로챌 수 있으며, 이벤트 발생시 동작을 정의할 수 있다. • 사용자와 상호 작용하는 주체가 뷰이므로 이벤트 콜백은 주로 뷰가 제공 booleanonTouchEvent (MotionEvent event) booleanonKeyDown (intkeyCode, KeyEvent event) booleanonKeyUp (intkeyCode, KeyEvent event) booleanonTrackballEvent (MotionEvent event)
6.1.1 이벤트 처리 – 2. 리스너 인터페이스 구현 • 리스터(Listener) : 특정 이벤트를 처리하는 인터페이스. • 대응되는 이벤트를 받는 단 하나의 메서드가 선언되어 있다. • 대표적인 몇가지리스너와리스너에 선언된 메서드는 다음과 같다. • View.OnTouchListener : booleanonTouch (View v, MotionEvent event) • View.OnKeyListener : booleanonKey (View v, intkeyCode, KeyEvent event) • View.OnClickListener : void onClick (View v) • View.OnLongClickListener : booleanonLongClick (View v) • View.OnFocusChangeListener : void onFocusChange (View v, booleanhasFocus) • 이벤트를 처리하려면 리스너를 구현하는 클래스를 선언, 그 객체를 생성해야 한다. • 등록 메서드는“ Set + 리스너“ • 상속을 받지 않아도 임의의 클래스가 구현 가능하다. • 별도의 리스너 클래스를 구현하고 리스너 객체를 생성해야 한다는 면에서 번거롭다.
6.1.1 이벤트 처리 – 3. 액티비티에서4.뷰에서 구현 3. 액티비티에서리스너 구현 • 액티비티는Activity클래스를 이미 상속 받았지만 인터페이스는 개수에 상관없이 얼마든지 상속받을 수 있다. 4. 뷰에서리스너 구현 • 뷰를 상속받을 경우 뷰도리스너를 구현 할 수 있다. • 자신의 이벤트를 스스로 처리한다는 면에서 기동성 향상. • 뷰를 상속받을 경우에만 이 기법을 쓸 수 있다.
6.1.1 이벤트 처리 – 5. 익명 이너 클래스 사용 • 익명 이너 클래스 문법을 활용하여 리스너 클래스 선언을 생략한다. • 리스너 생성을 위해 한번만 사용할 클래스 이므로 두 개 이상의 리스너는 만들 수 없다. • 익명 이너 클래스 정의 하는 문법은 다음과 같다.
6.1.1 이벤트 처리 – 6. 익명 이너 클래스의 임시 객체 사용 • 리스너 객체 두 개 이상 생성할 필요가 없다. • 이름없는 임시 객체로 생성하여 set 메서드의 인수로 전달한다. • 짧고 간단하지만 형식이 생소하다.
6.1.2 핸들러의 우선 순위 • 이벤트 핸들러가 중복 정의되었을 경우 미리 정한 우선순위에 따라 적절한 핸들러를 선택 호출 한다. • 범위가 좁은 핸들러가 먼저 호출한다. • 우선 순위의 핸들러에서true를 리턴하면 다음 순위는 호출되지 않는다.
6.1.3. 외부 변수 액세스 • 리스너는 등록하는 메서드의 지역 메서드가 아니다. • 리스너의 실행 시점은 등록 시점이 아니라 이벤트 발생시점이다. • 리스너에서 외부 객체의 멤버는 자유롭게 참조할 수 있다. • 리스너가 등록 메서드의 지역 변수를 참조하려면 final 지정자가 필요하다. • final은 지역 변수와 리스너의 존재 기간을 일치시킨다.
6.1.3. 외부 변수 액세스 findViewById메서드는 리소스를 뒤져 뷰를 찾아내는 복잡한 동작을 하므로 느리다.
6.1.3. 외부 변수 액세스 멤버변수로 지정 : 많아지면 코드가 뚱뚱해진다.
6.1.3. 외부 변수 액세스 지역변수로 선언(이너클래스에서 참조하기 위해서는 final을 선언해야 한다.)
6.1.3. 외부 변수 액세스 onCreate에 있던 리스너 코드를 SetTouchHandler라는 메서드로 분리했다.
6.1.3. 외부 변수 액세스 리스너로 전달하는 지역 변수를 final로 받았다.