안드로이드 프로젝트를 진행하면서 버튼 때문에 당황했던 적이 한 두 번이 아니다.

버튼은 당신이 그 어떤 색을 설정해도 보라색이 될 것이다.
버튼의 색상을 지정하는 속성 background, backgroundTint는 모두 View 클래스의 XML 속성(Attributes)이다.
XML attributes
XML 요소들에 부가적으로 추가할 수 있는 정보
(part of XML element)


처음부터 background에 별 의심하지 않고 color만 넣긴 했지만,
사실 background는 해당 속성을 추가할 위젯의 background처럼 사용할 drawable를 지정해주는 속성이다.
drawable
화면에 그릴 수 있는 리소스이다.
such as a PNG image, 9-patch, XML state list description...
이미지를 참조하거나 색을 지정할 수 있다.

backgroundTint는 background에 적용되는 속성이고,
마찬가지로 색의 값을 넣을 수 있다.
예시 코드를 다시 보자.

android:background="@color/white"
background의 색을 흰색으로 지정해주었음에도 불구하고 우리의 버튼 친구는 곧 죽어도 보라색이 좋다고 자신의 의지를 보여준다.

분명 똑같은 값을 주었는데, backgroundTint에만 적용했을 때 색이 바로 나온다. 이유는 일단 버전 문제이다. 오래된 버전을 사용하면 버튼의 색상이 background로 적용이 되지 않는다고 한다. 그래서 해결 방안으로,
AppCompatButton를 사용하면 적용되는 것을 볼 수 있다.

https://developer.android.com/reference/androidx/appcompat/widget/AppCompatButton
AppCompatButton
1 - background Tinit 메소드를 통해서 background의 tint를 동적으로 변경
2 - backgroundTinit, backgroundTintMode를 사용해서 background tint 색상 변경 가능
또 하필 보라색인 이유는 backgroundTint의 기본값이 보라색이기 때문이다. 그래서. backgroundTint만 설정해주었을 때는 색상이 맞게 나오는 것을 볼 수 있다.
아무튼, 버전이 예전 버전이라면 background 이슈가 발생할 수 있다.
위와 같이 버튼을 바꾸어주면 backgroundTintMode 역시 정상적으로 사용 가능하다.
정리
- background vs. backgroundTinit
-> background는 drawable 리소스를 적용해주는 것(+색)
-> backgroundTint는 background에 적용해주는 것
- 버튼 색 적용이 되지 않을 때
-> backgroundTint만 사용해준다
-> AppCompatButton을 Button 대신 사용한다
참고 사이트