공부/안드로이드

[안드로이드] 이벤트 처리

ghhong 2021. 8. 11. 09:26

이벤트는 화면의 어느 부분을 어떻게 클릭하거나 터치했는지에 대한 정보를 담고있다.

이 이벤트는 리스너로 전달된다. 따라서 버튼에 리스너를 등록해두면 버튼이 클릭될 때마다 리스너의 메소드가 자동으로 호출되게 된다. 이벤트의 종류는 터치 이벤트, 클릭 이벤트, 키 이벤트 등 다양하다.

 

클릭 이벤트를 처리하기 위해 OnClickListener라는 인터페이스를 구현하는 객체를 만든 후 버튼에 등록합니다.

그런데 버튼을 클릭하는 경우는 워낙 많아서 더 쉽게 이벤트를 처리할 수 있도록 onClick속성을 추가로 제공해줍니다.

XML레이아웃에서 onClick 속성의 값으로 메소드의 이름을 넣어주고 그 메소드를 소스코드에 추가하여 구현합니다.

 

터치 이벤트는 onTouchEvent 메소드를 재정의하고 키 이벤트는 onKeyDown이나 onKeyUp 메소드를 재정의합니다.

 

이미 만들어져 있는 뷰 객체의 터치 이벤트나 키 이벤트를 다루고 싶다면 OnTouchListener나 OnKeyListener를 설정하면 됩니다. 

View.OnTouchListener : boolean onTouch (View v, MotionEvent event) 
View.OnKeyListener : boolean onKey (View v, int keyCode, KeyEvent event)

 

터치 이벤트 처리하기

뷰 객체에 OnTouchListener를 설정하고 싶다면 setOnTouchListener 메소드를 사용합니다.

OnTouchListener 안에는 onTouch 메소드를 정의할 수 있는데 뷰가 터치되었을 때 이 메소드가 자동으로 호출됩니다.

파라미터로는 MotionEvent 객체가 전달됩니다. MotionEvent 객체에는 터치된 곳의 좌표와 함께 터치된 상태가 전달됩니다. 화면이 눌렸는지, 눌린 상태에서 움직였는지, 화면에서 손가락이 떼어졌는지를 구분할 수 있는 정보를 받을 수 있는 getAction 메소드를 이용합니다.

view.setOnTouchListener(new View.OnTouchListener() { 
    @Override
    public boolean onTouch(View view, MotionEvent motionEvent) {
        int action = motionEvent.getAction();

        if (action == MotionEvent.ACTION_DOWN) {
            println("손가락 눌림.");
        } else if (action == MotionEvent.ACTION_MOVE) {
            println("손가락 움직임.");
        } else if (action == MotionEvent.ACTION_UP) {
            println("손가락 뗌.");
        }
        return true;
    }
});

마지막 줄의 세미콜론, 파라미터의 범위 주의!

 

키 이벤트 처리

키 이벤트는 키패드의 키가 눌렸을 때 발생합니다. 또한 뒤로가기(BACK)키, 홈 키도 있습니다.

뒤로가기 키를 예로 들면 onBackPressed() 메소드를 재정의하면 됩니다.

또는 onKeyDown 메소드를 재정의하고 파라미터로 전달된 KeyEvent 객체를 참조합니다.

@Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
       if(keyCode == KeyEvent.KEYCODE_BACK) {
            Toast.makeText(this, "시스템 [BACK] 버튼이 눌렸습니다.", Toast.LENGTH_LONG).show();
            return true;
        }
    return false;
}