본문 바로가기

Programming/Android

[Android] Input Event


이벤트 리스너(EventListener)


void onClick( )
From View.OnClickListener
사용자가 항목을 터치하거나, navigation key 또는 트랙볼을 사용하여 해당 항목에 포커스를 맞추고 ‘Enter’키를 누르거나 트랙볼을 클릭하면 호출

1. 변수로 리스너 등록
// Create an anonymous implementation of OnClickListener
private OnClickListener mCorkyListener = new OnClickListener() {
    public void onClick(View v) {
      // do something when the button is clicked
    }
};

protected void onCreate(Bundle savedValues) {
    ...
    // Capture our button from layout
    Button button = (Button)findViewById(R.id.corky);

    // Register the onClick listener with the implementation above
    button.setOnClickListener(mCorkyListener);
    ...
}

2. Activity의 일부로 구현
public class ExampleActivity extends Activity implements OnClickListener {
    protected void onCreate(Bundle savedValues) {
        ...
        Button button = (Button)findViewById(R.id.corky);
        button.setOnClickListener(this);
    }

    // Implement the OnClickListener callback
    public void onClick(View v) {
      // do something when the button is clicked
    }
    ...
} 

boolean onLongClick( )
From View.OnLongClickListener
사용자가 항목을 길게 누르거나, navigation key 또는 트랙볼을 사용하여 해당 항목에 포커스를 맞추고 ‘Enter’키를 누르거나 트랙볼을 누를 때 호출(1초간)

@Return
true : 이벤트를 처리했으며 여기서 중단
false : 이벤트에 대한 처리가 아직 안 끝났거나 다른 on-click listener를 계속 진행할지 나타냄 

void onFocusChange( )
From View.OnFocusChangeListener
항목 쪽으로 이동하거나 항목에서 멀어질 때 호출

boolean onKey( )
From View.OnKeyListener
Focus를 맞추고 있으면서 하드웨어 키를 누르거나 키에서 손을 떼면 호출

@Return
true : 이벤트를 처리했으며 여기서 중단
false : 이벤트에 대한 처리가 아직 안 끝났거나 다른 on-key listener를 계속 진행할지 나타냄

boolean onTouch( )
From View.OnTouchListener
사용자가 터치 이벤트로서의 조건을 만족하는 작업을 수행하는 경우 호출(화면 안의 항목의 경계 내에서 이루어지는 모든 움직임 동작)
이 이벤트는 서로 연달아 발생하는 여러 개의 작업이 있을 수 있음

@Return
true : false 경우의 반대
false : ‘down’ 작업 이벤트를 수신 했을 때 반환하면 해당 이벤트를 사용하지 않으며, 이벤트로부터 이어지는 작업은 흥미 없음, 이 이벤트 내의 다른 모든 작업에 대해 호출 하지 않음

boolean onCreateContextMenu( )
From View.OnCreateContextMenuListener
Context Menu가 구축되는 중에 호출


참고: Androids는 우선 이벤트 핸들러부터 호출하고, 그 다음에 클래스 정의로부터 가져온 적절한 기본 핸들러를 두 번째로 호출합니다. 따라서, 이와 같은 이벤트 리스너에서 true를 반환하면 이벤트가 다른 이벤트 리스너로 전파되는 것을 중지시킬 뿐만 아니라 뷰에 있는 기본 이벤트 핸들러로의 콜백도 차단하게 됩니다. 따라서 true를 반환하는 경우 해당 이벤트를 종료하고 싶은 것인지 확신해야 합니다.

하드웨어 키 입력

하드웨어 키 입력은 항상 현재 포커스를 가진 뷰로 전달됨. 
View 계층의 맨 위에서 시작하여 아래 방향으로 적절한 목적지에 도달할 때까지 이벤트 전달
dispatchKeyEvent( ) 메서드를 통하여 이벤트 전달
View에서도 이벤트를 catch할 수 있지만, Activity 내부의 모든 이벤트를 onKeyDown( ) 및 onKeyUp( )을 사용하여 수신 가능
 

이벤트 핸들러

기본 이벤트 핸들러로 사용될 콜백 메서드를 여러개 정의할 수 있음

  • onKeyDown(int KeyEvent) : 새로운 키 이벤트 발생
  • onKeyUp(int, KeyEvent) : key up할 때 이벤트 발생
  • onTrackballEvent(MotionEvent) : 트랙볼 이벤트가 일어났을 때 발생
  • onTouchEvent(MotionEvent) : touchscreen 이벤트가 일어났을 때 발생
  • onFocusChanged(boolean, int, Rect) : View가 focus를 받거나 잃었을 경우 발생
  • Activity.dispatchTouchEvent(MotionEvent) : 모든 터치 이벤트가 창에 발송되기 전에 Activity가 가로챌 수 있음
  • ViewGroup.onInterceptTouchEvent(MotionEvent) : ViewGroup이 이벤트가 하위 View로 발송될 때 관측할 수 있음
  • ViewParent.requestDisallowInterceptTouchEvent(boolean) : 상위 View에 onInterceptTouchEvent(MotionEvent)가 있는 터치 이벤트를 가로채면 안된다고 나타낼 때 쓰임


Touch Mode

기기에 터치 기능이 있고, 사용자가 인터페이스를 터치하여 상호작용이 있는 경우
isFocusableInTouchMode( )가 true인 View만 포커스를 맞출 수 있음

isInTouchMode( ) : 기기가 현재 터치 모드인지 확인


Handling Focus

View가 제거되거나 숨겨지거나, 새 View를 사용할 수 있게 될 때 Focus를 변경하는 것이 포함됨

  • isFocusable( ) : View가 Focus를 받고 있는지
  • setFocusable(boolean) : View가 Focus를 받을지 여부를 변경
  • isFocusableInTouchMode( ) : 터치 모드에서 포커스를 받는 것이 허용되는지 여부
  • setFocusableInTouchMode(boolean) : 터치 모드에서 focus를 받을지 여부를 변경 

다음 Focus를 알기위한 알고리즘이 Android 내에 존재하나, 동작이 잘 안되는 경우
nextFocusDown, nextFocusLeft, nextFocusRight, nextFocusUp의 속성을 사용

  • requestFocus( ) : 특정 뷰에 포커스를 맞춤


Reference