안드로이드 개발 질문/답변
(글 수 45,052)
안녕하세요 저는 C를 이용해서 윈32를 조금 해봤습니다.
C에 조금 익숙해질라고 하던 무렵 안드로이드를 접하게 되었는데요.
자바도 첨이고 안드로이드도 첨이다 보니... 어려움이 많아져서
다른 고수님들꼐 질문을 드립니다.
질문은 다음과 같습니다.
win32에서는 일반적으로 쓰레드에서 메인쓰레드와의 충돌을 피하기 위해
PostMessage(ButtonHandle, WM_LBUTTONDOWN, ....)
1) 뭐 요딴식으로 메세지를 날려주거나
2) WM_USER+1 요런 메세지를 만들어서 날려주곤 했었습니다.
그런데 안드로이드 프로그램을 작성하면서 저런걸 어떻게 구현해야할 지 잘 모르겠습니다.
OnClickListener를 직접호출하기에는 뭔가 좀 이상하고
임의로 이벤트를 발생하기에는 실력이 부족하고... 좀 그렇습니다.
예제로 설명해주신다면 정말정말 감사하겠지만 ^^;
어떤 식으로 접근해야할지라도 알려주시기만 해도 복받으실겁니다.
그럼 많은 고수님들의 답변 기다리겠습니다.
==================
아 다시 읽어보니 너무 두서가 없어서 질문을 요약하겠습니다.
1. Click과 같은 이벤트를 임의로 특정 뷰에 전달하는 방법
2. 사용자 이벤트를 정의하여 사용하는 방법
이상입니다.
2010.07.27 01:11:06
저도 win32 에서 넘어와서 같은 의문을 가졌었습니다.
2번 질문의 안드로이드식 해답은 Handler + (Post or PostDelayed) + Runnable 입니다.
win32 식으로 얘기해서 현재 메세지 큐의 끝에 WM_USER+1 을 넣고, 그 메세지가 dispatch 될 때, funcA() 를 호출되게 하고싶다면
myHandler.post(new Runnable() {
public void run() {
funcA();
}
}
이렇게 되는 거죠. Handler 클래스는 이렇게 쓰는것 이외에도 여러개의 메세지를 만들던가 쓰레드 별로 별도 Handler 를 만드는 등등
아주 유연하게 쓰는 용법이 있으니 Handler 클래스 Doc, 쏘스, 예제들을 한번 찾아보세요.
1번질문.. 왠만한 경우에는 OnClickListener.onClick 과 같이 직접 호출해줘도 됩니다. 아니면 View.performClick() 같은 걸 불러주셔도 좋구요.
원한다면 실제로 클릭 이벤트(touch down, touch up) 을 직접 보낼수도 있습니다. MotionEvent.obtain() 으로 실제 down, up 이벤트를 만들어서 View.dispatchTouchEvent() 로 전달해주는 방법도 있습니다. 이경우는 대체로 위에 post 나 postDelayed 랑 같이 섞어서 쓰면 좋죠.