728x90
반응형
글을 쓰게 된 배경
MaterialSwitch 사용 중 track과 thumb 색상을 앱 테마에 맞춰야했다.
더 정확히 말하면 trackTint와 trackThumb를 바꿔주어야 했고 이 때 Android resource color directory에 selector를 사용해야 했다.
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/green" android:state_checked="true" />
<item android:color="@color/grey" android:state_checked="false" />
<item android:color="@color/light_grey" android:state_enabled="false" />
</selector>
처음에는 위와 같이 selector를 정의했는데 trackTint가 적용되지 않은 것처럼 보였다.
당시 추측으로는 몇 가지 상태값이 빠져있어서 원하는대로 동작하지 않는다고
생각해 상태값을 모두 추가해주었는데도 변함이 없었다.
그렇게 찾게된 공식문서에서 내가 만든 selector는 충실히 본인의 역할을 하고 있었다는 사실을 깨닫게 되었다.
문제의 원인
https://developer.android.com/guide/topics/resources/drawable-resource
위 문서에 의하면 selector는 가장 최소 요건을 충족하는 아이템을 가장 위에서 아래로 찾는다.
그러니 enabled 상태값이 의미가 없었다.
위에서 checked 상태에 따라 이미 색상을 정의해버렸기 때문이다.
해결
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/light_grey" android:state_enabled="false" />
<item android:color="@color/green" android:state_checked="true" />
<item android:color="@color/grey" android:state_checked="false" />
</selector>
enabled 속성이 먼저 고려되어야 하므로 이렇게 selector를 수정해주었다.
사실, MaterialSwitch의 track color selector는 조건이 더 복잡하지만
나의 경우엔 해당 수준까지 조건을 세분화할 필요가 없어 이처럼 사용했다.
728x90
반응형
'Android' 카테고리의 다른 글
Android UDP 통신해보기 in Kotlin (0) | 2024.04.20 |
---|---|
Android ListAdapter submitList not refreshing (0) | 2024.04.08 |
Android Change TextField Cursor Color (0) | 2024.03.13 |
Android UrlQuerySanitizer getValue error (0) | 2024.02.06 |
Android ADB로 크래시 로그 저장하기 (0) | 2024.02.03 |