Android Flexible widget layouts

사용 언어: Kotlin 1.6.10
사용 버전: Android Studio 2021.01.01

안드로이드 Flexible widget layouts를 알아보겠습니다.


홈 화면에 자신의 앱 Widget을 놔둘 수 있습니다. 대표적인 게 날씨 위젯이 있겠습니다.
이번 시간에는 위젯의 크기에 따라 다른 위젯 모양을 제공하는 유연한 위젯을 만들어 보겠습니다.

기본적인 Widget 만드는 법은 아래를 참고해서 만들어줍니다.



Android 12로 업그레이드되면서 Widget의 info를 넣어주는 xml에 추가해야 할 사항이 생겼습니다.

targetCellWidgth와 targetCellHeight가 필요합니다.


xml 오른쪽 클릭 - New - XML Resource File을 누릅니다.




File name에 원래 있는 파일 이름을 적습니다.

Root element에는 appwidget-provider를 적습니다.

Directory name에는 xml-v31을 적습니다.



뒤에 붙은 v31 뜻은 31 이상에 적용되는 xml이라는 뜻입니다.



이렇게 두 개가 생깁니다.





원래 있던 내용을 복사해서 붙여 넣은 다음, 위에서 말한 targetCellWidgth와 targetCellHeight를 추가해 줍니다.

저는 4x1 위젯이 기본이기에 4 칸과 1 칸을 넣어줬습니다.





제가 쓸 Widget 용 Layout은 두 개입니다.






Widget이 정의된 class로 갑니다.

거기에 함수 하나를 만듭니다. 이름은 원하는 걸로 하세요. 저는 updateMedicineWidget으로 만들었습니다.





이 함수는 onUpdate에서 불러올 겁니다.





updateMedicineWidget은 잠시 놔두고 함수를 하나 더 만듭니다.

이 함수의 기능은 크기에 따라 layout을 map 하는 함수입니다.

원하는 이름으로 하세요. 저는 getViewMapping으로 만들었습니다.




그리고 Map에 사용될 RemoteView를 만들어주는 함수를 하나 더 만듭니다.

원하는 이름으로 하세요. 저는 getRemoteView로 만들었습니다.





getRemoteView부터 뼈대를 만들어봅시다.

remoteView를 view에 사용할 텍스트나 버튼 등을 정의해 줍니다. 저는 그냥 글자 Y가 적히도록 만들어봤습니다.

그리고 layoutId를 통해서 layout마다 다른 구성을 정의할 수 있습니다. 저는 big에 button이 추가되었기에 button에 대한 행위를 정의할 수 있겠습니다.






위에서 만든 getRemoteView는 getViewMapping에 사용될 겁니다.





가로 276.0 ~ 276.0, 세로 51 ~ 101.0 이면 my_app_widget layout이 보이고, 가로 276.0 세로 102.0 이상이면 my_app_widget_big이 보이게 됩니다.

이 크기는 어떻게 정하느냐?





여기에 나와있습니다.




이제 updateMedicineWidget 함수로 갑니다.

Mapping을 만들고 updateAppWidget을 해주면 끝입니다.





근데 저기 빨간 밑줄이 보이시나요?

31 버전 이상에는 사용이 가능하다는 건데요. 하위 버전도 사용할 수 있게 만들어줘야 합니다.





낮은 버전에서 RemoteView를 만드는 함수도 만들어줍니다.

저는 updateAppWidget으로 만들었습니다.

여기서는 크기에 따른 layout을 수동으로 넣어줘야 합니다.





getAppWidgetOptions로 크기에 관련된 Bundle을 불러옵니다.

AppWidgetManager.OPTION_APPWIDGET_MAX_WIDTH는 현재 가로 크기를 알려줍니다.

AppWidgetManager.OPTION_APPWIDGET_MAX_HEIGHT는 현재 세로 크기를 알려줍니다.

이 속성들을 이용해서 크기에 맞는 layout을 부여해 줍니다.

isBig을 통해 큰 화면에 추가된 버튼과 관련된 부분을 따로 추가할 수 있습니다.





이제 updateMedicineWidget에 31 미만 버전도 사용할 수 있게 만들어줍니다.




그리고, 31 미만 버전에서는 크기 조절이 되지 않습니다.

이 부분은 onAppWidgetOptionsChanged 부분에서 해결합니다.

31 미만 버전에서만 onAppWidgetOptionsChanged가 필요하므로 if 문을 적어줍니다.

나머지는 updateAppWidget 함수 부분을 복사해서 넣어줍니다.






실행해 봅시다.




크기를 늘려볼까요?





끝.


카테고리: Android



댓글

이 블로그의 인기 게시물

Python urllib.parse.quote()

KiCad 시작하기 7 (FreeRoute 사용하기 2)

음악 총보(Score), 파트보(Part)

KiCad 시작하기 3 (새로운 소자 추가하기)

Android Kotlin short-circuit evaluation

KiCad 시작하기 1 (회로도 만들기)

Forensics .pyc 파일 .py로 복구하기

Kivy 시작하기 12 (Pyinstaller로 exe 파일 만들기)

Android Compose automation for getting localized images to use on Play Store app image

딩기 요트 명칭