티스토리 뷰

Android/정리

이벤트 처리

란텔 2016. 6. 8. 18:52

사용자가 화면을 터치하거나 키(홈키, 음량 등)를 누르면 이벤트가 발생하고 다음 메서드가 호출된다.


boolean onTouchEvent(MotionEvent event);
boolean onKeyDown(int keyCode, KeyEvent event);
boolean onKeyUp(int keyCode, KeyEvent event);

위와 같은 메서드들은 모두 Activity클래스에 정의되어 있다. 우리가 직접만드는 클래스는 모두 Activity의 서브클래스로 부터 상속받아 코딩하기 때문에 이 이벤트들을 오버라이딩 할 수 있다.




그리고 기존에 존재하는 뷰들에 대하여 이벤트를 사용하기 위해서 다음과 같은 리스너 인터페이스를 구현해서 이벤트를 발생 시킬 수 있다.

View.OnTouchListener View.OnKeyListener View.OnClickListner View.OnFocusChangeListener


안드로이드에서는 터치를 여러가지 행동으로 다시 나누는데 (스크롤하거나 두손가락으로 터치하는 등..) 이런 것을 '제스처(gesture)'라고 한다.

제스처를 이용하면 단순하게 터치하는 것보다 더 다양하게 이벤트를 처리할 수 있다.



다음은 제스처를 통해 처리할 수 있는 이벤트 메서드이다.

onDown()  //눌렀을 때
onShowPress()  //눌렀다 뗄 때
onSingleTabUp()  //한손가락으로 눌렀다 뗄 때
onSingleTabConfirmed()  //한 손가락으로 누를 때
onDoubleTab()  //두 손가락으로 누를 때
onDoubleTabEvent()  //두 손가락으로 누를 때, 떼거나 이동하는 등
onScroll()  //손가락을 누른채 일정한 방향으로 움직였다 뗄 때
onFling() //손가락을 누른채 빠르게 손가락을 움직였다 뗄 때
onLongPress() //손가락으로 오랫동안 누를때


터치와 관련된 행위를 하게 되면 onTouchEvent(MotionEvent me)메서드의 매개변수 타입인 MotionEvent에 해당 이벤트 정보가 전달되고, 메서드 안에서 me.getAction()메서드를 호출하면 사용자가 한 이벤트의 행위를 구분할 수 있다.


예를 들어 손가락으로 화면을 누를 때는 'MotionEvent.ACTION_DWON' 다시 손가락을 뗀다면 'MotionEvent.ACTION_UP'과 같은 이벤트가 발생함을 알 수 있다.


또 이벤트가 발생하는 좌표 값은 me.getX()나 me.getY()를 이용해 확인이 가능하다.





키 입력의 경우에는 onKeyDown이나 onKeyUp메서드를 오버라이딩하여 처리할 수 있으며, 매개변수로 전달되는 첫번째 인자 값인 keyCode값은 어떤 키가 사용되었는지 구분할 때 사용하고, 두번 째 매개변수인 KeyEvent타입은 전반적인 key의 정보를 알고 싶을 때 사용한다.

KeyEvent타입에는 아래와 같이 키값의 종류가 int형 상수로 각각 정의되어 있다.



다음은 그중에서 대표적인 키값을 정리한 것이다.

key 코드

설 명

KEYCODE_DPAD_LEFT

왼쪽 화살표

KEYCODE_DPAD_RIGHT

오른쪽 화살표

KEYCODE_DPAD_UP

위쪽 화살표

KEYCODE_DPAD_DOWN

아래쪽 화살표

KEYCODE_DPAD_CENTER

중앙 버튼

KEYCODE_CALL

통화 버튼

KEYCODE_ENDCALL

통화종료 버튼

KEYCODE_HOME

홈 버튼

KEYCODE_VOLUME_UP

음량 업 버튼

KEYCODE_VOLUME_DOWN

음량 다운 버튼

KEYCODE_0 ~ KEYCODE_9

0~9까지 키 값

KEYCODE_A ~ KEYCODE_Z

A~Z까지 키 값

KEYCODE_BACK

뒤로가기 버튼



KeyEvent로 간단한 코딩을 해보겠다.


기존에 startActivityForResult를 이용해 A라는 액티비티에서 B라는 액티비티로 넘어갈 때, B액티비티에서 안드로이드 기기의 뒤로가기 버튼을 누를 시에 A액티비티로 돌아 오면서 onActivityResult를 호출은 하지만 따로 B측에서 setResult메서드를 통한 인텐트 정보는 받아 올 수 없었다.


B액티비티 측에서 onKeyDown(int keyCode, KeyEvent event) 메서드를 오버라이딩하면 이런 문제를 해결 할 수 있다.



A액티비티 xml파일

  <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="다음 액티비티로 넘어가기"
        android:onClick="onAnotherActivity"/>

A액티비티 java 파일

public void onAnotherActivity(View v){
        Intent i = new Intent(this, TestEventActivity.class);
        startActivityForResult(i, 1000);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if(resultCode == RESULT_OK){
            String m = data.getStringExtra("message");
            Toast.makeText(this, "메인으로 돌아오면서 onActivityResult메서드가 호출됨>"+m, Toast.LENGTH_SHORT).show();
        }
    }

B액티비티 java 파일

@Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if(keyCode == KeyEvent.KEYCODE_BACK)
            close();

        return super.onKeyDown(keyCode, event);
    }


    public void close(){
        Intent i = new Intent();
        i.putExtra("message", "안녕하세요.");
        setResult(RESULT_OK, i);

        finish();
    }

이런식으로 코딩하면 B액티비티로 넘어 왔을 때, 뒤로가기를 누르면 onKeyDwon메서드를 호출하게 되는데 여기에서 if문을 타면서 사용자가 누른 keyCode값이 뒤로가기(KEYCODE_BACK)라면 close()메서드를 호출함으로써 A액티비티로 다시 돌아갈 때 setResult메서드를 통해 resultCode와 Intent를 전달할수 있게 된다.

Comments
최근에 올라온 글
최근에 달린 댓글
TAG
more
Total
Today
Yesterday