본문 바로가기
개발(Development)/Android(안드로이드)

[안드로이드] Button의 background 설정 및 커스텀 drawable(selector 등) 적용 불가 해결 방법

by 카레유 2021. 8. 4.

안드로이드 개발시,

버전에 따라 Button의 backgorund 설정이 안되는 경우가 있다.

 

일반적인 배경 색상 설정은 

background대신 backgroundTint 속성을 사용하면 된다.

 

하지만!!!

drawable에 selector 등을 적용하는 커스텀 버튼은

background는 물론 backgroundTint로도 작동하지 않는 경우가 있다.


# Button에 background 설정이 불가능한 이유

구글링을 해보니 문제의 원인은 다음과 같다고 한다.

 

특정 버전의 안드로이드 스튜디오는 프로젝트 생성시,

1.  Theme.MaterialComponents.DayNight.DarkActionBar를 디폴트 테마로 설정한다.

2. 해당 테마에서 Button을 만들면 MaterialButton으로 생성된다.

3. MaterialButton은 자체적인 background를 갖으며, android:background 속성에 설정된 값을 무시한다.

 

한마디로 MaterialComponents 테마는

Button 자체적으로 별도의 background가 적용되어 있어서 바꿀 수 없다는 것 같다.

 

문제를 해결하기 위해서는

1) 앱의 테마를 다른 걸로 바꾸거나,

2) 기본 Button을 따로 생성해서 사용해야 한다고 한다.


# 커스텀 Button의 background에 drawable 리소스 적용 불가 해결 방법

1. 테마 변경

theme.xml 파일의 style태그의 parent 속성을 MaterialComponent에서 AppCompat으로 변경한다.

테마를 변경하면 Button의 background에 커스텀 drawable 설정이 가능해진다.

 

- 기존:  <style name="Theme.LifeTimer" parent="Theme.MaterialComponents.DayNight.DarkActionBar"> 

- 변경:  <style name="Theme.LifeTimer" parent="Theme.AppCompat.DayNight.DarkActionBar"> 

* MaterialComponents을 AppCompat으로 변경만하면 되는듯 하다. 즉, Theme.AppCompat.Light 등으로 바꿔도 된다.

 

<resources xmlns:tools="http://schemas.android.com/tools">

    <!-- parent부분의 MaterialComponents을 AppCompat으로 변경! -->
    <style name="Theme.LifeTimer" parent="Theme.AppCompat.DayNight.DarkActionBar">
    
        <item name="colorPrimary">@color/purple_500</item>
        <item name="colorPrimaryVariant">@color/purple_700</item>
        <item name="colorOnPrimary">@color/white</item>
        <item name="colorSecondary">@color/teal_200</item>
        <item name="colorSecondaryVariant">@color/teal_700</item>
        <item name="colorOnSecondary">@color/black</item>
        <item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
    </style>
</resources>

 

 

2. Button 생성 방법 변경

테마를 변경하지 않을 경우엔

androidx.appcompat.widget.AppCompatButton이나 android.widget.Button으로 버튼을 생성한다.

 

- 기존:  <Button ... /> 

- 변경:  <androidx.appcompat.widget.AppCompatButton ... />  혹은  <android.widget.Button ... /> 

 

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <!-- AppCompatButton의 경우 drawable에 selector 적용이 잘 된다 -->
    <androidx.appcompat.widget.AppCompatButton
        android:background="@drawable/selector_button"
        android:id="@+id/appCompatButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        android:text="appCompatButton" />

    <!-- android.widget.Button의 경우 drawable에 selector 적용이 잘 된다 -->
    <android.widget.Button
        android:background="@drawable/selector_button"
        android:id="@+id/androidButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/appCompatButton"
        android:text="androidButton" />

</androidx.constraintlayout.widget.ConstraintLayout>

 

테스트 해본 결과 필자의 환경에선 아주 잘 작동한다.


더 자세한 내용은

Android Button background selector not working,

android button background drawable not working 등으로 검색해 보시거나,

 

아래의 글들을 참고해보시길.

 

https://stackoverflow.com/questions/64722733/android-background-drawable-not-working-in-button-since-android-studio-4-1

 

https://stackoverflow.com/questions/52743190/when-using-theme-materialcomponents-light-noactionbar-style-setting-button-back

 

https://stackoverflow.com/questions/31858374/android-button-background-color-not-changing

 

https://stackoverflow.com/questions/52673053/cant-use-androidbackground-with-button-from-the-new-material-components

 

 

댓글