태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

홈스크린 위젯을 만들어보자! - 버튼 추가하기

2010.11.23 17:00

저번 글에서는 홈스크린 위젯의 기초에 대해 알아보았으니, 이번 글에서는 홈스크린 위젯에서 상호작용을 할 수 있도록 버튼을 추가해보겠습니다.

지난번에 작업한 예제를 바탕으로 예제를 만들어보겠습니다. 실습을 시작하기 전에 예제를 미리 준비해주세요.

[어플리케이션 정보]

액티비티
  • 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 플래그를 지정하여 액티비티가 새로운 태스크에서 실행되도록 지정해야 합니다.

예제를 실행하고, 홈스크린에 위젯을 추가하면 다음과 같이 버튼이 위젯에 버튼이 추가된 모습을 확인하실 수 있습니다.



위젯의 버튼을 누르면 다음과 같이 브라우저가 실행되면서 지정한 페이지가 표시됩니다.




저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

커니 유저 인터페이스/홈스크린 위젯 , , , , , ,

  1. Blog Icon

    비밀댓글입니다

  2. 브로드캐스트(Broadcast) 메시지를 사용해야 합니다. 인텐트 필터를 생성하고, 해당 인텐트를 받으면 레이아웃을 변경하도록 구성하면 됩니다~

  3. Blog Icon
    Asran

    좋은 정보 너무 감사합니다~~커니님 덕분에 방향을 좀 잡은거 같습니다~^^

  4. Blog Icon

    비밀댓글입니다

  5. 배터리 정보가 변경될때마다 시스템에서 ACTION_BATTERY_CHANGED 브로드캐스트 메시지가 발생됩니다. 이 인텐트를 받는 브로드캐스트 메시지 사용하면 원하는 작업을 처리할 수 있습니다 :)

  6. Blog Icon
    log.did

    비밀 댓글입닏

  7. Blog Icon

    비밀댓글입니다

  8. 액션으로 Intent.ACTION_VIEW 를 지정해 주시고 setData(Uri.parse("http://google.com";)); 을 해주셨는지요?

  9. Blog Icon
    음..

    전 왜 안될까요? 버튼을 눌러도 인터넷화면이 안뜨네요..

  10. Logcat을 참고하시면 에러의 원인을 찾을 수 있을 겁니다. ㅎㅎ

  11. Blog Icon

    클릭 이밴트로 addview를 실행하고 싶은데 기존의 click이랑 달라서 모르겠네요 ㅠㅠ
    appwidget에선 어떻게 해야 하나요?

  12. addView()같은 방법으론 불가능하고, 위젯을 업데이트 요청한 후 다시 로드하는 과정에서 숨겨져 있던 뷰를 표시하는 방법 등으로 유사하게 구현할 수 있습니다.

  13. Blog Icon

    그리고 appwidget에서 dialog도 띄울수 있나요?

  14. PendingIntent 형태로 실행할 작업을 지정하므로 다이얼로그를 바로 띄우는 것은 불가능합니다. 대신 액티비티에 다이얼로그 테마로 표시되도록 하여 다이얼로그처럼 표시하는 방법은 있습니다.

  15. 정말 감사합니다 ㅜㅠㅜㅠㅜㅠ
    구글에서 검색해서 알게 됬는데 님 덕분에 홈 위젯을 만들수 있게 됐어요!!
    이미지를 검색해서 가는건 이미지뷰어 인가를 쓰면 되겠죠?

  16. Blog Icon
    ㅇㅇ

    왜 저는 Uri 라는곳에서 에러가 날까요? ㅠㅠ

  17. Blog Icon
    ㅇㅇ

    import android.net.Uri;
    이거 해주니까 되네요 ㅠㅠ

  18. Blog Icon
    ㅇㅅㅇ

    R.id.simple_widget_layout_activity 이랑
    R.layout.simple_widget_layout 이 안되요..ㅠㅠ 어떻게해야해요?

  19. 글 본문의 레이아웃(simple_widget_layout.xml)을 추가하셨나요?