티스토리 뷰

안녕하세요.

오늘은 안드로이드 OnClickListener를 사용하는 여러 가지 방법에 대해 알아보겠습니다.

( OnClickListener를 처음 접하시는 분은 적합하지 않은 글입니다. )

 

안드로이드에서는 여러 방법으로 OnClickListener를 사용할 수 있습니다.

 

1. 익명 클래스

click 이벤트가 어디서 처리되는지 쉽게 확인할 수 있고, 코드가 간결하기 때문에 자주 사용된다.

  • 이벤트가 일어나는 view(Button 등)의 개수가 적거나, 이벤트가 일어나는 view 간의 연관성이 적은 경우

  • 이벤트 핸들러 함수 내에서 익명 클래스 외부의 변수를 참조하지 않는 경우

  • 간단한 view 클릭 이벤트 테스트 코드를 작성하는 경우

Button btn = (Button) findViewById(R.id.btn);

btn.setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View v) {
    // 동작
  }
});

 

2. 익명 클래스 객체

1번 방법과는 다르게 익명 클래스 객체를 매번 생성하지 않는다.

  • Button이 여러 개이고 Button 간의 연관성이 많은 경우

  • 이벤트 핸들러 함수 내에서 익명 클래스 외부의 변수를 참조하지 않는 경우 (1번과 동일)

  • 나중에 다른 Button을 추가하여 사용할 가능성이 높은 경우

Button btn1 = (Button) findViewById(R.id.btn1);
btn1.setOnClickListener(click);
Button btn2 = (Button) findViewById(R.id.btn2);
btn2.setOnClickListener(click);

View.OnClickListener click = new View.OnClickListener() {
  @Override
  public void onClick(View v) {
    switch (v.getId()) {
      case R.id.btn1:
      	// btn1 동작
        break;
      case R.id.btn2:
        // btn2 동작
        break;
    }
  }
};

 

3. Listener 인터페이스를 implements 하는 Listener 클래스

이름이 부여된 Listener 클래스가 만들어짐으로써 이벤트가 어디서 처리되는지 명확하게 구분할 수 있다.

  • Listener 인터페이스를 상속함으로써 가독성을 높이고 싶은 경우

  • 나중에 다른 view를 추가하여 사용할 가능성이 높은 경우 (2번과 동일)

public class MainActivity extends AppCompatActivity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    BtnOnClick btnOnClick= = new BtnOnClick();
    
    Button btn1 = (Button) findViewById(R.id.btn1);
    btn1.setOnClickListener(btnOnClick);
    Button btn2 = (Button) findViewById(R.id.btn2);
    btn2.setOnClickListener(btnOnClick);
  }

  // 클래스를 따로 생성하여 이벤트 리스너 상속
  class BtnOnClick implements View.OnClickListener {
    @Override
    public void onClick(View v) {
      switch (v.getId()) {
        case R.id.btn1:
          // btn1 동작
          break;
        case R.id.btn2:
          // btn2 동작
          break;
      }
    }
  }
}

 

4. Listener 인터페이스를 implements 하는 activity

  • 이벤트 핸들러 함수에서 많은 수의 Activity를 액세스해야 하는 경우

  • Activity 내부의 view에 대한 click 이벤트를 한 곳에서 처리하고 싶은 경우

  • 익명 클래스 또는 별도의 이벤트 Listener를 만들고 싶지 않은 경우

// activity에 이벤트 리스너 상속
public class MainActivity extends AppCompatActivity implements View.OnClickListener {

  // Button의 이벤트 리스너로 this(MainActivity) 지정
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    Button btn1 = (Button) findViewById(R.id.btn1);
    btn1.setOnClickListener(btnOnclick);
    Button btn2 = (Button) findViewById(R.id.btn2);
    btn2.setOnClickListener(btnOnclick);
  }

  // View.OnClickListener를 implements하므로 onClick() 함수를 오버라이딩
  @Override
  public void onClick(View v) {
    switch (v.getId()) {
      case R.id.btn1:
        // btn1 동작
        break;
      case R.id.btn2:
        // btn1 동작
        break;
    }
  }
}

 

궁금한 부분이나 잘못된 부분이 있다면 댓글을 통해 알려주세요.

감사합니다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함