안드로이드 개발 정보
(글 수 1,067)
제목처럼, 눈팅만 하다가 처음으로 글을 작성합니다. 이벤트 코드 작성하는데, 짧은 아이디어가 있어서 말이죠.
구글 안드로이드 개발자 레퍼런스의 OnClickListener 코드 구현 예제에서 보면
위의 코드와 같이 되어 있는 것을 볼 수 있어요.
이렇게 예제 코드만 의존하여 코드를 작성한다면 나중에는 이벤트 리스너 코드만 줄줄이 나열되게 되죠.
결국에는 코드는 길어지고 알 수 없는 뭔가에 대해서 찝찝한 기분을 느끼게 되는데요.
이 문제에 대해서 조금이나마 코드 가독성 높이기 위해서,
아래처럼 이벤트 리스너를 구현해 보았어요.
이 글, 이 코드는 찜찜한 코드를 어떻게 해서라도 가독성을 높여보자는 것이고,
이벤트 리스너 선언 부분과 처리 부분에 대한 코드를 분리하면 좀 더 보기 편한 코드가 되지 않을까? 하는 막연한 추측이 되겠네요.
물론 Activity를 상속받은 클래스 내부에서 이 직접 구현해도 되겠지만,
따로 분리를 하여 아래의 코드와 같이 작성해 놓으면 한 파일내의 코드가 짧아져 좀 더 보기 편할거란 생각이네요.
만약 onClickListener이 빈번하게 사용된다면, ActionActivity를 다음과 같이 구현해도 괜찮을 듯 보입니다..
View.OnClickListener 인터페이스를 선언을 미리 하고, 후에 필요시 생성 하는 거죠. ㅎㅎㅎ
구글 안드로이드 개발자 레퍼런스의 OnClickListener 코드 구현 예제에서 보면
final Button button = (Button) findViewById(R.id.button_id); button.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { // Perform action on click } });
위의 코드와 같이 되어 있는 것을 볼 수 있어요.
이렇게 예제 코드만 의존하여 코드를 작성한다면 나중에는 이벤트 리스너 코드만 줄줄이 나열되게 되죠.
결국에는 코드는 길어지고 알 수 없는 뭔가에 대해서 찝찝한 기분을 느끼게 되는데요.
이 문제에 대해서 조금이나마 코드 가독성 높이기 위해서,
아래처럼 이벤트 리스너를 구현해 보았어요.
이 글, 이 코드는 찜찜한 코드를 어떻게 해서라도 가독성을 높여보자는 것이고,
이벤트 리스너 선언 부분과 처리 부분에 대한 코드를 분리하면 좀 더 보기 편한 코드가 되지 않을까? 하는 막연한 추측이 되겠네요.
물론 Activity를 상속받은 클래스 내부에서 이 직접 구현해도 되겠지만,
따로 분리를 하여 아래의 코드와 같이 작성해 놓으면 한 파일내의 코드가 짧아져 좀 더 보기 편할거란 생각이네요.
package org.example.ImplListener public class ViewClickListener implements View.OnClickListener { public void onClick(View v) { // Perform action on click. } }
package org.example; public class ActionActivity extends Activity { protected void onCreate(Bundle saved) { super.onCreate(saved); setContentView(R.layout.action); final Button button = (Button) findViewById(R.id.show); button.setOnClickListener(new ViewClickListener()); } }
만약 onClickListener이 빈번하게 사용된다면, ActionActivity를 다음과 같이 구현해도 괜찮을 듯 보입니다..
package org.example; public class ActionActivity extends Activity { protected void onCreate(Bundle saved) { super.onCreate(saved); setContentView(R.layout.action); final Button button = (Button) findViewById(R.id.show); View.OnClickListener clickListener; // ... 중략 ... clickListener = new ViewClickListener(); button.setOnClickListener(clickListener); } }
View.OnClickListener 인터페이스를 선언을 미리 하고, 후에 필요시 생성 하는 거죠. ㅎㅎㅎ
2010.11.25 21:10:42
단순히 onClick이라면 xml에서 설정할 수 있습니다.
}
뷰 자체를 xml을 이용하지 않고 만든다면 안되지만,
레이아웃을 설정할 때 지정이 가능합니다.
public void methodName(View view)
{
}
라고 액티비티에 메소드를 정의하고
xml의 android:onClick="methodName" 을 설정하시면
해당 뷰의 클릭이벤트가 생기면 호출이 됩니다.
2010.11.26 16:18:47
리스너 클래스를 만들어 쓰는 것도 상황에 따라 장단점이 있는 것 같아요.
단순히 플래그 설정을 위해 리스너를 분리하는 건 불필요하게 보이지 않을까요?
코드의 정답은 없는 것 같습니다. 상황에 따라 맞게 쓰는게 중요한 것 같습니다.
2010.11.30 16:09:59
저도 액티비티를 상속받는 클래스에서 인터페이스를 구현시켜버립니다....
한 액티비티의 레이아웃 게체들에 대해서 온클릭 이벤트를 줄줄히 넣는게 보기 편해서요...
public class A extends Activity implements View.OnClickListener {
....
public void blahblah() { ... }
...
public void onClick(View v) {
if (v == findViewById(R.id.a)) { ... }
else if (v == findViewById(R.id.b)) { ... }
else if (v == findViewById(R.id.c)) { blahblah() }
}
그리고 클래스안의 메소드를 접근하는데도 이방법이 편하더군요....
(패턴상으로 좋은방법인지는 모르겠습니다.... 패턴에대해선 잘 몰라서요...)
아무래도 합성방법이 편하고 가독성도 높은 것 같습니다.
간단히 클릭리스너만 implements해서 onclick함수를 오버라이딩 하게 되면 이 자바소스에서 클릭리스너를 사용할 컴포넌트를 set만 한다면
모두 onClick함수에서 id값이나 tag값 등으로 구별하여 이벤트 핸들링할 수 있기 때문이죠.
이 소스는 안드로이드가 아니더라도 자바에서도 똑같이 되는 부분입니다.
저도 이렇게 많이 사용하고 있어요 ㅋㅋㅋ 제목을 OnClickListener의 사용으로 하시면 더 좋을 것 같네용 ㅋㅋ