이 게시물을 무단으로 사용하는 행위(비영리, 영리 포함)는 CCL 2.0 저작자 표시-비영리-변경금지 라이센스에 의거하여 금지되어 있습니다. 원본 글의 출처 및 저작자를 표시해 주신다면 글의 스크랩은 자유롭게 하실 수 있습니다. 단, 비영리 목적의 발표(스터디 등)에 위 글을 사용하고 싶으신 분은 제게 미리 메일로 문의 부탁드립니다.
저작권과 관련된 자세한 사항은 이곳을 참조해 주시기 바랍니다.
저작권과 관련된 자세한 사항은 이곳을 참조해 주시기 바랍니다.
저번 글에서는 홈스크린 위젯의 기초에 대해 알아보았으니, 이번 글에서는 홈스크린 위젯에서 상호작용을 할 수 있도록 버튼을 추가해보겠습니다.
지난번에 작업한 예제를 바탕으로 예제를 만들어보겠습니다. 실습을 시작하기 전에 예제를 미리 준비해주세요.
[어플리케이션 정보]
액티비티
레이아웃
XML
액티비티
- SimpleActivity.java (SimpleActivity)
레이아웃
- simpleactivity.xml (SimpleActivity)
- simple_widget_layout.xml (위젯 레이아웃)
XML
- simplewidget.xml (위젯 프로바이더)
API Level
- 8 (Android 2.2)
이번 강좌에서는 위젯에 버튼을 추가하고, 버튼을 누르면 액티비티를 호출하도록 만들어보겠습니다. 먼저 위젯의 레이아웃을 다음과 같이 수정합니다. 버튼이 하나 추가되었습니다.
[simple_widget_layout.xml]
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:background="@drawable/widget_background_4_1" android:gravity="center" android:layout_height="wrap_content" android:layout_width="fill_parent" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="#000000" android:textSize="20dp" android:id="@+id/simple_widget_layout_text" android:text="Hello, Widget!" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/simple_widget_layout_activity" android:layout_marginLeft="10dp" android:text="Activity" /> </LinearLayout>
다음, 위젯 소스코드를 다음과 같이 수정합니다.
[MySimpleWidget.java]
public class MySimpleWidget extends AppWidgetProvider {
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds){
final int N = appWidgetIds.length;
for (int i=0; i<N; i++) {
int appWidgetId = appWidgetIds[i];
RemoteViews views = buildViews(context);
appWidgetManager.updateAppWidget(appWidgetId, views);
}
}
private PendingIntent buildActivityIntent(Context context){
Intent intent = new Intent(Intent.ACTION_VIEW)
.setData(Uri.parse("http://google.com"));
PendingIntent pi = PendingIntent.getActivity(context, 0, intent, Intent.FLAG_ACTIVITY_NEW_TASK);
return pi;
}
private RemoteViews buildViews(Context context){
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.simple_widget_layout);
views.setOnClickPendingIntent(R.id.simple_widget_layout_activity, buildActivityIntent(context));
return views;
}
}
버튼을 눌렀을 때 액티비티를 띄우기 위해 buildActivityIntent()에서 PendingIntent를 생성하고, setOnClickPendingIntent()를 통해 버튼을 클릭했을 때 수행할 PendingIntent를 지정합니다. 홈스크린 위젯에서 액티비티를 호출할 때는 액티비티 스택이 없는 상태이므로 Intent.FLAG_ACTIVITY_NEW_TASK 플래그를 지정하여 액티비티가 새로운 태스크에서 실행되도록 지정해야 합니다.
예제를 실행하고, 홈스크린에 위젯을 추가하면 다음과 같이 버튼이 위젯에 버튼이 추가된 모습을 확인하실 수 있습니다.
위젯의 버튼을 누르면 다음과 같이 브라우저가 실행되면서 지정한 페이지가 표시됩니다.
'유저 인터페이스 > 홈스크린 위젯' 카테고리의 다른 글
| 홈스크린 위젯을 만들어보자! - 버튼 추가하기 (15) | 2010/11/23 |
|---|---|
| 홈스크린 위젯을 만들어보자! - 간단한 위젯 작성하기 (13) | 2010/10/24 |
안드로이드 정보, 강좌를 누구보다 빨리 접하고 싶으신가요?
그렇다면 이메일 구독 혹은
를 통해 업데이트되는 최신 글들을 받아보실 수 있습니다. :)




SimpleWidget2.zip
댓글을 달아 주세요
비밀댓글입니다
2011/04/04 11:24 [ ADDR : EDIT/ DEL : REPLY ]브로드캐스트(Broadcast) 메시지를 사용해야 합니다. 인텐트 필터를 생성하고, 해당 인텐트를 받으면 레이아웃을 변경하도록 구성하면 됩니다~
2011/04/05 11:09 [ ADDR : EDIT/ DEL ]좋은 정보 너무 감사합니다~~커니님 덕분에 방향을 좀 잡은거 같습니다~^^
2011/04/05 18:05 [ ADDR : EDIT/ DEL : REPLY ]비밀댓글입니다
2011/04/13 10:53 [ ADDR : EDIT/ DEL : REPLY ]배터리 정보가 변경될때마다 시스템에서 ACTION_BATTERY_CHANGED 브로드캐스트 메시지가 발생됩니다. 이 인텐트를 받는 브로드캐스트 메시지 사용하면 원하는 작업을 처리할 수 있습니다
2011/04/18 09:30 [ ADDR : EDIT/ DEL ]비밀 댓글입닏
2012/01/20 18:08 [ ADDR : EDIT/ DEL : REPLY ]비밀댓글입니다
2012/01/21 19:29 [ ADDR : EDIT/ DEL : REPLY ]액션으로 Intent.ACTION_VIEW 를 지정해 주시고 setData(Uri.parse("http://google.com"
); 을 해주셨는지요?
2012/01/22 09:13 [ ADDR : EDIT/ DEL ]전 왜 안될까요? 버튼을 눌러도 인터넷화면이 안뜨네요..
2012/07/30 18:41 [ ADDR : EDIT/ DEL : REPLY ]Logcat을 참고하시면 에러의 원인을 찾을 수 있을 겁니다. ㅎㅎ
2012/07/31 14:05 [ ADDR : EDIT/ DEL ]클릭 이밴트로 addview를 실행하고 싶은데 기존의 click이랑 달라서 모르겠네요 ㅠㅠ
2012/08/07 15:56 [ ADDR : EDIT/ DEL : REPLY ]appwidget에선 어떻게 해야 하나요?
addView()같은 방법으론 불가능하고, 위젯을 업데이트 요청한 후 다시 로드하는 과정에서 숨겨져 있던 뷰를 표시하는 방법 등으로 유사하게 구현할 수 있습니다.
2012/08/09 20:19 [ ADDR : EDIT/ DEL ]그리고 appwidget에서 dialog도 띄울수 있나요?
2012/08/07 15:57 [ ADDR : EDIT/ DEL : REPLY ]PendingIntent 형태로 실행할 작업을 지정하므로 다이얼로그를 바로 띄우는 것은 불가능합니다. 대신 액티비티에 다이얼로그 테마로 표시되도록 하여 다이얼로그처럼 표시하는 방법은 있습니다.
2012/08/09 20:20 [ ADDR : EDIT/ DEL ]정말 감사합니다 ㅜㅠㅜㅠㅜㅠ
2013/03/09 01:12 [ ADDR : EDIT/ DEL : REPLY ]구글에서 검색해서 알게 됬는데 님 덕분에 홈 위젯을 만들수 있게 됐어요!!
이미지를 검색해서 가는건 이미지뷰어 인가를 쓰면 되겠죠?