홈 위젯 13개를 삼성 위젯 옆에 놓고 다시 고친 기준 7가지
앱 5개의 홈 위젯 13개를 실기기 홈 화면에 삼성 날씨·페이 위젯과 나란히 놓고 보니 "코드가 있다" 와 "상용 앱처럼 보인다" 는 전혀 달랐습니다. 시스템 다크 모드 추종, 빈 상태 디자인, previewLayout 과 label, dp 모서리, 비트맵 위젯의 테마 지연까지 고친 기준을 씁니다.
위젯은 앱 안이 아니라 남의 화면(홈)에 놓입니다. 그래서 잘 만들었는지는 앱 안에서가 아니라, 홈 화면에 삼성·구글 위젯과 나란히 놓고 봐야 압니다. 앱 5개의 위젯 13개(광고 수익 앱 3, 시험 디데이 6, 일출·일몰 2, 스크린타임 1, 반려동물 1)를 그렇게 놓고 보니 고칠 게 많았습니다.
1. 홈 화면의 다크 모드를 따른다
한 앱은 위젯이 앱 안의 테마 설정을 따르고 있었습니다. 홈이 다크인데 위젯만 밝은 판이 뜹니다. 위젯은 시스템 다크 모드를 따라야 합니다. values-night 리소스로 색을 분기하면 RemoteViews 가 알아서 골라 줍니다.
단, 비트맵으로 그리는 위젯(그래프, 달력 그리드)은 한계가 있습니다. 테마가 바뀌어도 다음 갱신(최대 30분)까지 옛 판이 남습니다. 이건 고칠 수 없는 한계라 알고 넘어갑니다.
2. 빈 상태·권한 없음 상태도 디자인한다
데이터가 없을 때 "데이터가 없습니다" 회색 한 줄만 두면 2×2 에서 잘립니다. 아이콘 + 제목 + 줄바꿈된 안내 한 줄로 만듭니다. 위치 권한이 없을 때, 아직 기록이 없을 때, 앱을 처음 깔았을 때 각각 어떤 화면인지 실기기에서 다 봐야 합니다.
3. previewLayout 과 리시버 label
위젯 피커에서 앱 아이콘만 덜렁 뜨는 앱이 있었습니다. android:previewLayout 이 없어서입니다. 그리고 한 앱의 위젯 6개가 피커에서 전부 「시험 디데이 위젯」이라는 같은 이름이었습니다. 리시버에 android:label 을 위젯마다 다르게 줍니다.
previewLayout 은 코드를 실행하지 않고 XML 만 그립니다. 실제 위젯 레이아웃을 그대로 지정하면 빈 값이 뜨므로, 예시 값을 박아 둔 미리보기용 사본 레이아웃을 따로 둡니다.
4. 빈 공간을 채운다, 앱 이름 머리줄은 뺀다
그리드 위젯은 항목 수에 맞춰 칸을 재배치하고, 리스트의 빈 줄은 「+ 추가」 점선으로 채웁니다. 4×2 는 보조 정보 줄(평일/주말 같은)을 둡니다. 숫자 위젯은 큰 숫자 하나 + 증감 색 알약 + 7일 막대 정도로 끝냅니다.
반대로 위젯 맨 위에 앱 이름을 머리줄로 넣지 않습니다. 삼성 위젯에는 그런 줄이 없고, 놓고 보면 "만든 티"가 그 줄에서 납니다.
5. 좌표 대신 지명
위치 기반 위젯에 위도·경도를 그대로 찍는 건 아무도 안 읽습니다. Geocoder 로 지명을 받아 캐시하고, 실패하면 「내 위치」로 둡니다.
6. 모서리는 dp 로, 여백은 비례로
모서리 반지름을 "슬라이더 40 = 반원" 식 비율로 계산했더니 큰 위젯에서 폭의 25%짜리 알약이 됐습니다. 모서리는 약 20dp 고정, 1×1 만 짧은 변의 22% 상한을 둡니다. 안쪽 여백도 고정 12px 로 두면 큰 카드에서 글자가 모서리에 붙습니다. 칸 크기에 비례시킵니다. 그리드에 항목이 하나뿐이면 배경 판 없이 카드만 둡니다. 판 위에 카드 하나는 테두리처럼 보입니다.
7. 미리보기 PNG 의 초승달
미리보기 이미지를 다크 배경 캡처에서 잘라 쓰면 모서리에 초승달 모양의 배경이 남습니다. 카드 반지름으로 다시 마스킹합니다. 다크용은 drawable-night-nodpi 에 따로 둡니다.
RemoteViews 가 허용하는 뷰만
빌드는 통과하는데 위젯이 아예 안 열리는 경우가 있었습니다. 레이아웃에 <View> 하나를 구분선으로 넣은 게 원인입니다. RemoteViews 는 허용된 뷰 클래스만 받고, 아닌 게 하나라도 있으면 위젯 전체가 로드되지 않습니다. 구분선은 ImageView 나 배경이 있는 FrameLayout 으로 대신합니다.
확인 방법
실기기(갤럭시 노트10, One UI) 홈에 위젯을 실제로 배치해서 라이트/다크, 실데이터/빈 상태 네 장을 다 봅니다. 배치를 자동화하면서 알게 된 것 하나: 위젯 설정(configure) 액티비티가 뜨면 「저장」을 눌러야 위젯이 남습니다. 안 누르고 홈으로 나가면 삭제됩니다.
두 앱(스크린타임, 반려동물)은 이 기준을 이미 충족해서 손대지 않았습니다.
정리
- 위젯 판정은 홈 화면에서, 상용 위젯 옆에 놓고 합니다.
- 시스템 다크 추종, 빈 상태 디자인, previewLayout + label, dp 모서리, 비례 여백.
- 앱 이름 머리줄은 넣지 않습니다.
- RemoteViews 허용 뷰만.
<View>하나로 위젯이 통째로 안 뜹니다. - 라이트/다크 × 실데이터/빈 상태 네 장을 실기기에서 봅니다.