[Doit! 안드로이드 앱 프로그래밍] 이벤트처리와 widget
참고서적: Doit 안드로이드 앱 프로그래밍
Event 처리과정
안드로이드 에서의 이벤트처리는 윈도우보다 좀더 까다롭다.
안드로이드의 이벤트는 화면을 손가락으로 터치하는 TouchEvent와 키패드의 입력에의한 KeyEvent 가 있다.
TouchEvent는 꽤 복잡하다. 손가락으로 눌럿을때, 누르면서 움직일때, 눌럿다가 뗏을때, 누르고 가만히잇을때, 등등 이렇게 복잡한 경우들이 존재한다.
그경우를 좀더 쉽게하기 위해 ClickEvent를 별도로 제공한다.
그 예는 가장간단한 버튼의 onClick 메소드가 있다.
onClick 메소드는 각각의 view들의 setOnClickListener() 메소드를 통해 이벤트를 설정할수 있다. 이메소드는 onClickListener 인터페이스를 구현하여 간편하게 onClick() 메소드를 override 하여 원하는 동작을 하도록 구현할수있다.
Event를 위젯객체에 전달한후 이후의 처리과정을 위젯객체에 위임한다 하여, 이와같은 모델을 위임모델 이라고 부른다. 위임모델의 처리루틴으로 각각의 위젯마다 개별적으로 이벤트를 처리하는 객체지향코드를 만들수있다.(다형성의 오버라이딩)
Gesture Event
손가락을 좌우로 스크롤할때와 같은 일종의 패턴을 Gesture 라고한다. Gesture event는 손가락을 누른후 움직이는 event와같은 복잡한 형태의 event를 더쉽게 처리할수 있도록 도와주는 이벤트처리기다. 그중 대표적인것으로 onDown()은 화면이 눌렷을경우를 처리해주는 메소드고, onScroll()은 화면이 눌린채 일정한 속도와 방향으로 움직인 경우를 처리해주는 메소드다. 외에 9개의 메소드로 TouchEvent 이후의 더복잡한 과정을 더쉽게 처리할수있다.
GestureEvent는 GestureDetector 클래스에 정의되어있다. 객체할당후 터치이벤트를 전달하면, 각상황에맞는 메소드를 객체가 호출한다. 호출된 메소드들을 오버라이딩 하여 원하는 이벤트에 대한 처리를 할수 있다.
Key Event
keyEvent는 onKeyDown() 메소드를 재정의하거나, OnKeyListener 인터페이스를 구현하는 onKey()메소드를 통해 처리할수 있다. 이메소드에 전달되는 파라미터는 KeyCode와 KeyEvent로 두가지이다.
KeyCode는 어떤키가 사용되었는지 구별하고, KeyEvent는 무슨key에대한 event인가 를 구별한다.
시스템버튼중 하나인 BACK 버튼도 keyEvent로 처리할수있다. (onBackPressed() 메소드를통해 처리가능)
하지만 홈화면과 앱목록 키는 앱에서 직접제어는 안되고, 입력되었는지 에대한 정보만 확인 가능하다.
단말방향 전환시 이벤트처리
단말방향이 바뀌엇을때는 화면비율(가로세로)에 따라 다시보이게 된다. 이때, xml레이아웃이 다르게 보여야 하므로 액티비티가 메모리에서 없어졋다가 다시만들어지게 된다.
두가지 방식이있다.
가로와 세로에 대해 다르게 표현하고 싶을때와 그럴필요없이 단순히 화면에 보이는 레이아웃만 바꾸는 방식 이 있다.
첫번째 경우에대해서는 layout-land폴더 안에 있는 xml레이아웃 파일을 사용한다.
layout-land폴더는 layout폴더에있는 xml파일(세로방향)의 가로방향에 대한 xml 이다. 이폴더는 미리지정된 폴더이다. 두개의 xml에 각각 원하는 방식으로 구현하면 된다.
단, 처음 말햇듯이 세로방향 액티비티가 메모리상에 없어졋다가 가로방향 액티비티가 메모리상에 올라가게되는데 이때 액티비티상에 미리선언해둔 변수값이 사라지게 되므로 변수값을 복원해야한다.
이과정은 액티비티 생명주기에 포함된다.
액티비티 생명주기는 안드로이드 디벨로퍼스에 상세하게 설명되어있다.
onSaveInstanceState콜백 메소드 를통해 액티비티가 종료되기 전의 상태를 저장할수있다.
그리고나서 onCreate() 메소드가 호출될때 bundle 객체로 복원할수있다.
두번째 경우에 대해서는, manifest에 activity부분에 configChanges 속성을 설정하면 된다.
속성값이 설정되면 시스템은 액티비티의 상태변화를 액티비티에 알려준다. 그런후 방향이 바뀔때 자동으로 configurationChanged() 메소드가 자동으로 호출되고, 이인터페이스를 구현하여 각방향에 따른 상태변화를 처리하면 된다.
Widget
이책에서 대표적으로 설명하는 위젯에는 토스트,스낵바,대화상자 그리고 프로그래스바 이다.
가장 간단한 토스트 메세지는 메세지를 잠깐 보여주었다가 사라지는 위젯이다.
Toast.makeText(Context context, String message, int duration).show() 를 통해 간단하게 사용가능하다.
Context객체는 context클래스르 상속한 액티비티를 사용한다. 참조할수없는 경우에는 getApplicationContext()메소드를 호출하면 Context객체가 반환된다.
중간의 String message에는 string 타입의 원하는 메세지를 넣어주고, duration은 Toast.LENGTH_LONG 이나 SHORT로 메세지를 얼마나 띄울것인가를 나타낸다.
토스트의 위치는 setGravity(정렬위치)와 setMargin(외부여백 지정) 을통해 지정시켜줄수있다.
또한, 토스트 역시 버튼과같은 위젯으로 Drawable을 이용하여 토스트의 모양이나 색깔을 바꿔줄수도 있다.
스낵바는 토스트와 비슷하다.
SNackbar.make(View,Message,duration).show() 형태로 사용한다.
알림대화상자는 토스트와 스낵바와달리 사용자에게 Yes 나 No와같은 선택박스를 클릭하게 할때 사용된다.
AlertDialog 클래스는 알림 대화상자를 보여주는 가장 단순한 방법이다.
- setTitle() : 타이틀지정
- setMessage() : 메세지지정
- setIcon(): 아이콘지정
- setPositiveButton() 예를 눌럿을경우
- setNegativeButton() 아니오를 눌럿을경우
- setNeutralButton() 중립버튼 (취소같은경우) 을눌럿을경우
위와같은 메소드로 대화상자를 표현하고 버튼에대한 이벤트를 처리할수있다.
프로그래스바는 어떤일의 진행정도를 표현할수있는 bar 이다.
seekBar와같은 형태로 막대나 원모양으로 눈금만큼 표시하여 나타낸다. ProgressDialog 클래스에 정의되어있다.
- setProgress() : 정수값으로 프로그래스바의 현재값 설정
- incrementProgressBy() 현재설정된값을 기준으로 더하거나 뺄때 사용
- dissmiss() 대화상자를 없애는 메소드
댓글남기기