[Android] Event Android 2011. 12. 15. 14:38
이벤트는 어떤 특정한 사건이 발생 할 경우 일어나는 것을 말하고 있따.

콜백 메서드를 이용하거나 이벤트 리스너를 이용 할 수 있다.

콜백 메서드는 시스템에 의해 자동적으로 호출되는 메서드이고, 리스너는 이벤트에 대한 인터페이스 임을 알아두자.

콜백의 경우 다음과 같은 간단한 코드로 테스트 할 수가 있다.

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mView view = new mView(this);
        setContentView(view);
    }
 
 protected class mView extends View
 {
  public mView(Context context){
   super(context);
  }
  
  public boolean onTouchEvent(MotionEvent event){
   super.onTouchEvent(event);
   if(event.getAction()==MotionEvent.ACTION_DOWN){
    Toast.makeText(ImageViewActivity.this, "touch", Toast.LENGTH_SHORT).show();
    return true;
   }
   return false;
  }
 }

이 코드를 실행해서 아무 곳이나 누르면 토스트가 떠서 작동 됨을 확인 할 수 있다.

다음은 리스너를 이용하여 만든 코드를 보자.

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        View view = new View(this);
        view.setOnTouchListener(listen);
        setContentView(view);
    }
 
 class listener implements View.OnTouchListener
 { 
  public boolean onTouch(View v, MotionEvent event){   
   if(event.getAction()==MotionEvent.ACTION_DOWN){
    Toast.makeText(ImageViewActivity.this, "touch", Toast.LENGTH_SHORT).show();
    return true;
   }
   return false;
  }
 }
 
 listener listen = new listener();

처음 코드와 다른 점은 View를 생성해서 거기에 해당하는 리스너를 연결 해 준다는 것이다.

또한 인자 값에 View 객체를 받는 인자도 추가 된다. 별 다른 점은 크게 없는 것을 볼 수 있다.

다른 케이스로 액티비티가 리스너를 구현 할 수 있다. 그 방법은 다음과 같다.

public class ImageViewActivity extends Activity implements View.OnTouchListener{
 
    /** Called when the activity is first created. */
 
 @Override   
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        View view = new View(this);
        view.setOnTouchListener(this);
        setContentView(view);
    }
 
 public boolean onTouch(View v, MotionEvent event){   
  if(event.getAction()==MotionEvent.ACTION_DOWN){
   Toast.makeText(ImageViewActivity.this, "touch", Toast.LENGTH_SHORT).show();
   return true;
  }
  return false;
 }
}

다음은 뷰에서 리스너 구현 방법이다.

public class ImageViewActivity extends Activity{
 
    /** Called when the activity is first created. */
 
 @Override   
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mView view = new mView(this);
        view.setOnTouchListener(view);
        setContentView(view);
    }
 
 protected class mView extends View implements View.OnTouchListener
  {
   public mView(Context context){
    super(context);
   }
  
   public boolean onTouch(View v, MotionEvent event){
    super.onTouchEvent(event);
    if(event.getAction()==MotionEvent.ACTION_DOWN){
     Toast.makeText(ImageViewActivity.this, "touch", Toast.LENGTH_SHORT).show();
     return true;
    }
    return false;
   }
  }
}

다음은 이너 클래스를 쓰는 방법이다.

public class ImageViewActivity extends Activity{
 
    /** Called when the activity is first created. */
 
 @Override   
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        View view = new View(this);
        view.setOnTouchListener(listener);
        setContentView(view);
    }
   private View.OnTouchListener listener = new View.OnTouchListener() {  
  @Override
  public boolean onTouch(View v, MotionEvent event) {
      if(event.getAction()==MotionEvent.ACTION_DOWN){
       Toast.makeText(ImageViewActivity.this, "touch", Toast.LENGTH_SHORT).show();
       return true;
      }
      return false;
  }
 };
}

마지막으로 가장 함축된 형태를 나타내는 코드로 이벤트를 설정 할 때 그 순간 객체를 생성해서 넘기는 방법이다.

또한 이런 이벤트 핸들러들은 우선 순위를 가진다.

제일 처음 뷰의 리스너이고 다음이 뷰의 콜백 메서드, 마지막으로 액티비티의 콜백 메서드 순으로 호출이 된다.