이벤트를 처리하는 방식 중에 이벤트를 처리하는 객체를 생성하여 이벤트를 처리하는 방법에 대해서 알아보자.
이벤트를 처리하는 메소드들이 정의된 인터페이스를 이벤트 리스너라고 한다.
이벤트 리스너는 여러가지가 존재하지만 가장 많이 사용하는 대표적인 리스너 인터페이스들을 보여주겠다.
※여기서 콜백 메소드란 다른 함수에 인자로 전달되는 함수이며 어떤 이벤트가 발생한 후에 작동되는 것이다.
리스너 | 콜백 메소드 | 설명 |
View.OnClickListener | onClick() | 어떤걸 터치했을때 |
View.OnLongClickListener | onLongClick() | 일정시간 동안 그대로 터치하고 있으면 발생 |
View.OnFocusChangeListener | onfocusChange() | 다른항목으로 포커스가 이동할때 |
View.OnKeyListener | onKey() | 포커스를가지고 있는 항목 위에서 키를 눌렀다가 놓았을떄 |
View.OnTouchListener | onTouch() | 터치이벤트로 간주되는 동작을 했을때 |
이처럼 이벤트 리스너는 인터페이스라서 implements를 해줘야 하는데 이에도 4가지 방법이 있다.
(예로 View.OnClickListener를 사용하겠다.)
1. 리스너 클래스를 내부 클래스로 정의
이건 클래스를 따로 만들어서 해당 리스너를 implements 해서 해당 클래스로 객체를 생성하는 방법이다.
해당 클래스로 객체를 여러 개 만드는 거라면 모를까 그런 게 아니라 단 한 번의 이벤트를 사용하는 거라면 추천하지 않는
방법이라고 한다.
왜냐하면 그때 쓸 때만 잠깐 만들면 되는데 객체를 따로 생성하는 것이기 때문에 불필요한 공간을 차지하게 된다.
일단 이 방법이 뭔지 한번 보자.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
public class MainActivity extends AppCompatActivity {
class MyListener implements View.OnClickListener{
@Override
public void onClick(View view) {
Toast.makeText(getApplicationContext(),"내부 클래스로 만든것임",Toast.LENGTH_SHORT).show();
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button)findViewById(R.id.custB);
MyListener ml = new MyListener();
button.setOnClickListener(ml);
}
}
|
cs |
이처럼 위에서 MyListener라는 클래스로 View.OnClickListener를 implements 해서
그 안에 있는 메서드 onClick()을 오버 라이딩해 재정의 해준다.
그리고 onCreate() 안에서 위에서 만든 MyListener 클래스로 ml이라는 객체를 생성해주고
custB라는 id로 가져온 button 뷰의 setOnClickListener() 함수에 인자로 객체 ml을 넣어준다.
(왜냐 하면 해당 함수는 함수 인자로 View.OnclickListener를 받기 때문이다.)
이렇게 하면 custB라는 id를 가진 애가 onClick이라는 이벤트가 발생하면 이를 가만히 듣고 있던
View.OnclickListener를 상속받은 ml이 이를 듣고 onClick()이라는 메서드를 콜백 하게 되는 것이다.
2. 리스너 클래스를 무명 클래스로 처리하는 방법
자바에는 상속받은 자식 클래스 없이 그 자리에서 익명의 객체를 만들어서 사용하는 '무명 클래스' 방법이 있다.
언제 있을지 모를 이벤트에 대한 처리를 무명 클래스 방식으로 이벤트 리스너의 객체를 생성해서 이벤트 리스너를 사용하는 방법이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button)findViewById(R.id.custB);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(getApplicationContext(),"무명 클래스로 만든것임",Toast.LENGTH_SHORT).show();
}
});
}
}
|
cs |
보면 button에서 안에 따로 객체를 생성하지 않고 일회성으로 사용하는 것을 볼 수가 있다.
1번에서 사용했을 때와는 다르게 코드수가 엄청나게 줄어든 것을 볼 수가 있다.
3. 액티비티에 인터페이스를 구현하는 방법
이건 MainActivity 클래스에서 해당 리스너를 implement 해서 사용하는 방법이다.
사용하는 방법은 아래와 같다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button)findViewById(R.id.custB);
button.setOnClickListener(this);
}
@Override
public void onClick(View view) {
Toast.makeText(getApplicationContext(),"액티비티로 만든것임",Toast.LENGTH_SHORT).show();
}
}
|
cs |
MainActivity 클래스에서 View.OnClickListener를 implements 해서
button.setOnClickListener(this);에서 해당 클래스에서 재정의 했기 때문에 this를 썼다.
4. 람다식을 이용해서 인터페이스를 구현하는 방법
람다식을 이용해서 하는 방법을 보여주기 전에 일단 람다식에 대해서 알아보자
4-1. 람다식이란?
(매개변수) ->{함수 몸체}
이런 식으로 함수를 선언함과 동시에 익명 객체를 만들어서 사용하는 것이다.
람다식에 관한 자세한 설명은 아래 블로그를 참조해서 보면 더 좋을 것 같다.
그럼 이제 람다식으로 한 예제를 보자
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
public class MainActivity extends AppCompatActivity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button)findViewById(R.id.custB);
button.setOnClickListener(view -> {
Toast.makeText(getApplicationContext(),"람다로 만든것임",Toast.LENGTH_SHORT).show();
});
}
}
|
cs |
이렇게 view라는 매개변수를 씀과 동시에 익명 객체를 만들어서 사용하는 것이다.
이를 사용하면 코드는 간결해지지만 너무 자주 사용하면 오히려 가독성을 떨어뜨린다.
그리고 성능도 안 좋아진다는데 자세한 내용은 위의 블로그에 나와 있으니 참조하면 될 것 같다.
'코딩일기 > android studio' 카테고리의 다른 글
Android 독학 6일차 : CheckBox 이벤트 처리 (0) | 2021.03.11 |
---|---|
안드로이드 독학 5일차 : EditText 이벤트 처리 (0) | 2021.03.10 |
안드로이드 독학 4일차 : 커스텀 버튼 만들기 (0) | 2021.03.09 |
안드로이드 독학 4일차 : res 폴더 분석하기 (0) | 2021.03.08 |
안드로이드 독학 4일차 : 자바 소스로 인터페이스 작성하기 (0) | 2021.03.08 |