2015. 1. 29. 13:05ㆍProgramming/Android
App widget 위젯이란, 아래 그림과 같이 홈스크린 화면에 떠서 USER와 소통 하는 녀석을 말합니다.
[HomeScreen에 떠있는 Widget의 모습]
위젯을 만들기 위해서는 크게 4가지 준비물들이 필요합니다.
1. AppWidgetProvider Class를 상속받은 Provider Class 2. Widget의 View Layout을 기술한 xml 파일 3. Widget의 속성 (Meta data)를 기술한 xml 파일 4. Widget의 속성과 Receiver를 정의할 AndroidManifest.xml 파일 |
자 그럼 순서대로 Widget을 만드는 방법에 대해 알아 보겠습니다.
1. AppWidgetProvider Class를 상속받은 Provider Class |
위젯의 기능을 정의한 Class (실제 위젯의 동작들을 정의한 Class 입니다.)
2. Widget의 View Layout을 기술한 xml 파일 |
위젯의 모양을 정의하는 xml 입니다. (실제 위젯이 홈스크린에 붙일 경우의 아래의 xml 형태의 모양이 됩니다.)
3. Widget의 속성 (Meta data)를 기술한 xml 파일 |
위젯의 속성을 지정하는 xml 파일 입니다. (최소 가로, 세로 Size 설정, widget의 Layout 설정)
widget_configuration.xml
4. Widget의 속성과 Receiver를 정의할 AndroidManifest.xml 파일 |
위젯의 속성과 기능들을 사용할 수 있게 정의해놓은 xml 파일 입니다.
자 이렇게 해서 완성된 APP Widget을 구경해 볼까요? |
자 그럼 한단계 한단계 코드를 보면서 설명하겠습니다.
AppWidgetProvider를 상속받게 되면 widget 동작 및 생명주기에 관한 아래의 메서드들을 오버라이드 해서 사용해야 합니다. 필수적으로 구현해야 하는 부분 이므로 유심히 보셔야 합니다. public void onEnabled(Context context)
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)
public void onDeleted(Context context, int[] appWidgetIds)
public void onDisabled(Context context)
public void onReceive(Context context, Intent intent)
자 그럼 구현한 코드를 보겠습니다.
onUpdate 메서드에서 주의 사항 입니다. 만약 아래의 시계 Widget 에서 시침을 빼야 한다면, 이미 홈스크린에 붙여진 모든 Widget의 시침을 빼야 하기 때문에 모든 Widget의 개수를 얻어와서 Update 해줘야 합니다. APP Widget에서 UI를 셋팅해 주는 부분 입니다. 보통 Widget(TextView, EditText등..)과는 달리 APP Widget에서는 RemoteViews를 사용해서 UI를 구성해 주어야 합니다. 1. APP Widget은 RemoteViews를 사용해서 UI를 구성해야 합니다. RemoteViews의 설명과 사용법에 대한 내용은 아래의 내용을 참고 하시기 바랍니다. RemoteViews의 설명과 사용법 : http://blog.naver.com/PostView.nhn?blogId=huewu&logNo=110089286698 2. 역시 위와 마찬가지로 모든 APP Widget의 개수를 얻어와서 Update 해줘야 합니다. 3. 중요한 부분입니다. onUpdate() 메서드에서도 보시면 appWidgetManger.updateAppWidget() 이란 메서드를 사용하고 있는데요. APP Widget에 관한 모든 부분은 AppWidgetManger가 관리를 해주고 있기 때문에, APP Widget의 Update나 관리, Receiver 사용시에 활용하게 됩니다. APP Widget의 onReeive() 메서드 부분 입니다.
특별히 Widget의 Layout 이라고 다른게 아니라, 보통 Layout 작성하듯 만들어 주시면 됩니다. 대신 이벤트들은 보통 view와는 달리 Remoteviews의 setOnClickPendingIntent() 메서드를 사용해야 합니다. PendingIntent에 대한 자세한 설명은 아래를 참고 하시기 바랍니다. initUI() 에서 이벤트 클릭시 Flow 입니다. 1. initUI() 이벤트 클릭하면 Intent 전달. (Intent Action = arabiannight.tistory.com.widget.ACTION_EVENT) 2. AndroidManifest.xml 파일에서 해당 intent Action에 대한 filtering 작업을 진행 합니다. 3. 전달받은 Intent와 동일한 Intent Filter가 선언되어 있는지 확인 합니다. 4. 동일한 Intent Filter가 선언되어 있을 경우, 전달받은 Intent를 MyCustomWidget(AppWidgetProvider) 의 onReceive()메서드로 전송해 줍니다. onReceive() 메서드에는 아래와 같은 코드가 구현되어 있기 때문에 전달 받은 Intent에 맞는 조건문을 실행하게 됩니다.
위젯의 속성을 지정하는 xml 파일 입니다. (최소 가로, 세로 Size 설정, widget의 Layout 설정) widget_configuration.xml
- 부가적인 것 : Widget의 configuraion 변경을 제공할 Activity
- Widget Cell Size 위젯은 홈스크린의 일정 공간을 차지합니다. 홈스크린에서 위젯이 차지할 수 있는 공간은 홈스크린을 일정한 비율로 나눈 영역인 셀(Cell) 단위로 관리되며, 위젯의 크기는 셀을 몇 개 사용하느냐에 따라 결정됩니다. 일반적으로 안드로이드 단말에서 위젯이 차지할 수 있는 홈스크린 영역은 다음과 같이 가로 4개, 세로 4개 총 16개로 나누어집니다. 홈스크린에서 위젯이 차지할 수 있는 영역 구성 각 위젯은 최소 1개의 셀부터 시작하여 최대 16개의 셀을 차지할 수 있으며, 사각형 형태로만 셀을 차지할 수 있습니다. (4x1, 2x2 등) 위젯이 차지하는 셀의 크기는 매니페스트의 위젯 노드에서 설정하며, 이에 대한 자세한 사항은 잠시 뒤에 살펴보겠습니다. - minWidth, minHeight 속성 지정 하기 화면에 표시되는 위젯의 크기는 위젯 프로바이더의 Min width, Min height 속성에 따라 결정됩니다. 위젯은 셀(Cell) 단위로 홈스크린의 공간을 차지합니다. 홈 스크린의 화면 전환을 감안하면 한 셀의 한 변이 가질 수 있는 최소 크기는 74dp 입니다. 여기에서 안드로이드 단말의 다양한 해상도로 인해 위젯이 화면에 표시될 때 오차가 발생하는 것을 감안하여 양 쪽에 1dp씩을 빼주면, 실질적으로 한 셀의 한 변이 가질 수 있는 최소 크기는 72dp가 됩니다. 셀 크기에 따른 최소 크기를 계산하는 공식은 다음과 같습니다. (셀 개수 * 74) - 2 (단위 : dp) 위의 공식을 사용하여 계산한 셀 개수에 따른 최소 크기는 다음과 같습니다. 위에서 계산한 수치를 통해 일반적으로 많이 쓰이는 위젯의 크기를 정리해보면 다음과 같습니다. 여기에서는 4x2 크기의 위젯을 작성하므로, Min width에 294dp, Min height에 146dp를 지정하였습니다.
위젯의 속성과 기능들을 사용할 수 있게 정의해놓은 xml 파일 입니다. AndroidManifest.xml 등록 과정
파일첨부 : 스크린샷 : 출처: http://arabiannight.tistory.com/238 , http://arabiannight.tistory.com/entry/안드로이드Android-App-widget을-만들어-보자-2 |
'Programming > Android' 카테고리의 다른 글
[Android] GPS 좌표값 두 개의 거리 구하기 (0) | 2014.08.11 |
---|---|
[Android] 뒤로가기(BackButton) 두번 눌러서 앱 종료! (0) | 2014.07.31 |
Button animation 만들기! (0) | 2014.07.20 |
Activity 화면 꺼지지 않게 유지하기! (0) | 2014.07.11 |
GyroSensor 사용하기 (0) | 2014.07.11 |