- 위젯에서는 알파 값 적용하는 방식이 제한되어 있다.- 이미지 같은 경우에는 setInt - "setAlpha"를 통해 적용하고, 텍스트의 경우에는 실제 알파 값이 적용된 컬러를 textColor로 지정해주어야 한다. remoteViews.setInt(R.id.widgetRootImg, "setAlpha", alpha)- 참고로 setAlpha에 들어가는 alpha 값의 범위는 0~255이다. - 원하는 투명도 %를 아래 공식을 통해 계산하여 반영해주어야 한다.val alpha = transparency * 255 / 100 - Int형 Color 값에 알파 값을 적용하려면 다음과 같이 처리한다. 예시로 30% 적용할 경우val colorWithAlpha = (textColor and 0x00FFFFF..
Widget
- 안드로이드에는 위젯 인스턴스 하나마다 고유한 ID를 가진다. 이게 AppWidgetId이다. - 바탕화면에 똑같은 위젯 두 개를 생성해도 개별 ID는 다르다. 이를 통해 서로 바라보는 데이터를 달리할 수 있다. - 예를 들어 A-1 위젯에서는 Key + A-1-AppWidgetId로 1번 데이터를, A-2 위젯에서는 Key + A-2-AppWidgetId로 2번 데이터를 저장하고 렌더링 할 수도 있는 것이다. - 기존 XML RemoteViews 방식 위젯에서는 아래와 같이 AppWidgetId 조회가 가능하다.override fun onUpdate( context: Context, appWidgetManager: AppWidgetManager, appWidgetIds: IntAr..
- 위젯 갱신을 위한 refresh 함수에서 생성자 접근 시에 발생했다.val widgetInstance = widgetClass.getDeclaredConstructor().newInstance() - 위젯 클래스를 생성자 없는 object로 선언하고, 생성자 접근 코드를 제거하여 refresh 함수를 수정했다.object MemoListWidget : GlanceAppWidget() {fun updateAll(context: Context) { CoroutineScope(Dispatchers.IO).launch { val manager = GlanceAppWidgetManager(context) val now = System.currentTimeMillis() ..
- 안드로이드 Glance에서 특정 화면을 열거나 로직을 수행하기 위해서는 GlanceModifier.onClick()에 Action을 명시해주어야 한다. - Glance의 Action은 UI 요소에 "동작"을 연결하는 역할을 하는 개념이다.위젯에서 특정 Activity 열기- 먼저 Glance에서 특정 화면을 열기 위해 ActionIntent는 아래와 같이 사용한다.modifier = GlanceModifier .size(20.dp) .clickable(onClick = actionStartActivity( Intent(context, WidgetSettingsActivity::class.java).apply { data = Uri.parse(KEY_WIDGE..

- 위젯을 구현하다 보면 사이즈 별로 다른 레이아웃을 제공하거나 높이 너비에 따라 View의 구성이 달라지는 구현을 필요로 할 때가 있다. - 기존 RemoteViews에서는 AppWidgetInfo에 접근하여 사이즈 값에 대해 확인했으나 Glance에서는 좀 다르다.appWidgetManager.getAppWidgetInfo(appWidgetId).minHeight - SizeMode 라는 값을 통해 위젯 크기 변화에 따른 레이아웃 구성 대응이 가능하다. - SizeMode는 Glance 위젯이 시스템에서 요구하는 사이즈 정보의 유연성을 어떻게 처리할지를 정의한다.sealed interface SizeMode { /** * The [GlanceAppWidget] provides a sing..

- 다음처럼 위젯을 만들었는데 실제 Box 크기에 비해 위젯 영역을 너무 많이 차지하는 문제가 있었다. - 실제 위젯 View Box 크기와는 관계없이 Receiver 구성 시 사용되는 resource의 minWidth, minHeight를 제대로 설정해주지 않고 무지성으로 지정해서 생기는 문제이다. - 아래와 같은 공식으로 셀 크기를 계산해준다. cellSize = (minSize + gap) / cellGap 셀 간격 (cellGap): 74dp셀 여백 (gap): 30dp→ 셀 1개 = 70dp(셀 크기) + 16dp(패딩 포함) ≈ 74dp 기준- 따라서 2x2 사이즈를 원한다면?minWidth = 2 * 74 - 30 = 118dpminHeight = 2 * 74 - 30 = 118dp - ..
- xml RemoteViews 방식의 위젯 구성 중에 컴포넌트를 통해 구분선을 만들려고 하는데, 빌드하고 나니 '위젯을 표시할 수 없습니다'라는 오류가 발생했다. - 이것은 같은 ViewGroup 계층이어도 RemoteViews에서 지원 가능한 View 종류가 한정되어 있기 때문이다. A class that describes a view hierarchy that can be displayed in another process. The hierarchy is inflated from a layout resource file, and this class provides some basic operations for modifying the content of the inflated hierarchy.R..
- 기존의 RemoteViews XML 기반 위젯에서는 PendingIntent를 통해 Activity를 열었다. - 하지만 Glance에서는 actionStartActivity() 함수를 사용한다.fun actionStartActivity( intent: Intent, parameters: ActionParameters = actionParametersOf(),): Action = StartActivityIntentAction(intent, parameters, null)- Glance 위젯에서 특정 Activity를 시작하기 위한 Action 객체를 생성하는 함수다. - 즉, Glance의 Modifier.clickable 안에서 사용할 수 있는 동작(Action)을 만들어서 연결해 준다..
- Glance에서는 일반 Compose와는 다르게 Glance 전용 패키지로 UI 구성 요소를 제공한다.import androidx.glance.GlanceIdimport androidx.glance.GlanceModifierimport androidx.glance.Imageimport androidx.glance.ImageProviderimport androidx.glance.LocalContextimport androidx.glance.action.Actionimport androidx.glance.action.clickableimport androidx.glance.appwidget.GlanceAppWidgetimport androidx.glance.appwidget.GlanceAppWidgetM..

- 자사 서비스에서 신규 위젯을 추가하기로 했는데, 기존의 RemoteViews 방식이 아닌 Compose Glance 기반으로 위젯 구현을 진행해 봤다. - RemoteViews의 경우에는 XML 레이아웃을 조작해서 화면에 표시하는 방식이다. 클릭 이벤트는 PendingIntent로 처리 - Glance의 경우에는 Compose 기반인데, 백그라운드에서는 RemoteViews 기반이지만 개발자가 직접 코드로 다룰 필요가 없음. 가독성도 좋고 onClick 처리도 GlanceModifier를 통해 간단하지만 역시 위젯 특유의 제한 사항은 존재한다. - 먼저 아래 설정을 Gradle에 추가해 준다.implementation("androidx.glance:glance:1.1.1")implementation(..