안드로이드 개발 질문/답변
(글 수 45,052)
위젯에 올려져 있는 버튼을 잡아 동작을 설정해 주려고 합니다.
Activity의 경우 findViewById로 설정해줘서 onClicklistener 로 설정해 주면 될텐데..
AppWidgetProvider 를 상속 받은 페이지에서 findviewbyId가 먹히질 않네요.
이 페이지에서 따로 잡을 수 있는 방법이 있는지 궁금합니다.
답변 부탁드립니다.
2009.09.14 22:03:10
위젯은 현재 애플리케이션과는 다른 프로세스에서 동작을 합니다. 즉 onClickListener등의 직접적인 이벤트 핸들러 설정은 할수 없지요. 노쑤님이 말씀하신 setOnClickPendingIntent등의 Intent를 이용해서 조작할 수 있습니다.
2009.11.10 18:49:42
윗분들의 설명을 좀더 자세하게 적어 드리겠습니다.
views.setOnClickPendingIntent(R.id.control_next, pendingIntent);
여기서 views는 RemoteViews입니다. 위젯에서는 Activity와는 다르게 RemoteViews를이용하여
레이아웃, 이벤트등을 처리합니다.
위 메소드를 사용하기 위해서는 Action을 가지고 있는 Intent의 생성이 필요합니다.
Action은 static변수로 선언해 놓으시면 되구요.
Intent intent = new Intent(ACTION_DELETE);
PendingIntent pi = PendingIntent.getBroadcast(widgetContext, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
views.setOnClickPendingIntent(R.id.img_delete, pi);
이런식으로 Click이벤트를 등록하며
AndroidManifest.xml 에
<intent-filter>
<action android:name="com.android.widget.message.action.DELETE" />
</intent-filter>
이렇게 등록해주셔야 합니다.
다시 위젯 메인 소스에서 onReceive메소드를 오버라이드 하신후
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
String action = intent.getAction();
if(action.equals(ACTION_DELETE)){
}
}
위와같이 구현하시면 위젯의 컴포넌트에 Click이벤트를 적용하실수 있습니다.
views.setOnClickPendingIntent(R.id.control_next, pendingIntent);
여기서 views는 RemoteViews입니다. 위젯에서는 Activity와는 다르게 RemoteViews를이용하여
레이아웃, 이벤트등을 처리합니다.
위 메소드를 사용하기 위해서는 Action을 가지고 있는 Intent의 생성이 필요합니다.
Action은 static변수로 선언해 놓으시면 되구요.
Intent intent = new Intent(ACTION_DELETE);
PendingIntent pi = PendingIntent.getBroadcast(widgetContext, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
views.setOnClickPendingIntent(R.id.img_delete, pi);
이런식으로 Click이벤트를 등록하며
AndroidManifest.xml 에
<intent-filter>
<action android:name="com.android.widget.message.action.DELETE" />
</intent-filter>
이렇게 등록해주셔야 합니다.
다시 위젯 메인 소스에서 onReceive메소드를 오버라이드 하신후
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
String action = intent.getAction();
if(action.equals(ACTION_DELETE)){
}
}
위와같이 구현하시면 위젯의 컴포넌트에 Click이벤트를 적용하실수 있습니다.
views.setOnClickPendingIntent(R.id.control_next, pendingIntent);
이런식으로 쓰네요