Android/Kotlin in android

Button의 backgroundTint, 글자색 바꾸기 (style, selector 사용)

닉네임도항상고민 2024. 2. 23. 19:08

안드로이드에서,

Button의 backgroundTint, 글자색 바꾸기 (style, selector 사용)

 
 
* 필자가 글쓰기 편하도록 음씀체로 작성되었습니다.
 
 
파일 만들때는 color리소스에 color추가 -> selector -> style -> Button에 참조거는 순으로 되겠지만,
Button -> style -> selector순으로 블로깅했음, 중간에 빨간불 나는거 보고 파일 생성하면 됨.
 
 
필자는 파일명을 좀 길게 지었고,
이 게시물은 친절한 설명은 아니고, 이미 해봤던 사람들 코드 참고하라고 올렸음.
 
 
이게 어려운거는 아닌데 귀찮고, 구글링하게 되면 끝도없이 스택오버플로랑, 웹페이지 보게 되니까
그냥 아무 블로그나 잡아서 만드는게 나은 듯 함.
chatgpt한테 만들어 달라니까 이거는 잘 못 만들어냈음....ㅜ
 
스택오버플로에서도  selector구현하는 소스를 자주 보게 되는데, 페이지 대충 보다가 닫아버리면 찾지를 못하겠다
 
근데 이거는 전혀 어려운게 아니고 그냥 하면 됨.
 
style파일 따로 안 만들거면, button에 바로 옵션적고, selector파일 만들어서 넣으면 됨.
 
==========================================
 
 

// 1. 적용하려는 Button

style="@style/만든스타일이름"

<Button
    android:id="@+id/deleteModeButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginEnd="8dp"
    android:text="@string/delete"
    app:layout_constraintTop_toTopOf="@+id/addButton"
    app:layout_constraintEnd_toStartOf="@+id/saveButton"
    app:icon="@drawable/baseline_toggle_on_24_white"
    style="@style/DeleteModeButtonStyle"
/>

 
 
==========================================
 

// 2. style파일 생성

 
res/value/styles.xml 
대충 위치와 파일이름, 파일이름은 입맛대로?
 
- parent에는 스타일을 오버라이딩 할 원하는 Button, 난 Widget.AppCompat.Button, 머티리얼 타입 버튼이 될 수도 있겠다.
- style태그에서 name이, Button에서 참조할때 쓸 이름
- android:textColor : 버튼의 글자색 속성
- backgroundTint : 버튼의 색상 
- 나는 색상을 바꿀거라서, color 디렉토리를 하나 생성해서 거기에 selector파일을 생성했음, 모양까지 바꾸려면 drawble 디렉토리에 만들면 될 듯함.? drawble에 넣어뒀으면 @drawble/파일명으로 참조
@drawable, @color 참조가 자동완성이 잘안되던데, 손수 타이핑해서 입력,  그래도 안되면 클린빌드
 
이 두 속성 말고, android:textColor / backgroundTint 다른 속성으로도 되는게 있을 수 있는데,
나는 이거로 했을때 내가 원하는 동작으로 되었음.
 
- backgroundTint가 api21이상만 먹힌다고 보이던데?, 그 이하를 지원해야하면 다른 방법 찾아야할지도 모르겠다.

<resources>
    <style name="DeleteModeButtonStyle" parent="Widget.AppCompat.Button">
        <item name="android:textColor">@color/selector_delete_mode_button_textcolor</item>
        <item name="backgroundTint">@color/selector_delete_mode_button_tint</item>
    </style>
</resources>

 
 
==========================================

// 3. selector 파일 생성

 
res/color/your_selector_name.xml
나는 color 디렉토리를 하나 생성해서 거기 넣었고, 
모양까지 바꾸려면, drawble에 넣으면 될 듯.
 
// 글자색 바꾸는 selector

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:color="@color/white" />
    <item android:color="@color/button_enable_false_textcolor" />
</selector>

 
 
android:state_pressed : 누르고 있을때 컬러가 바뀌게 하는것.
저런 상태가 있는 item을 위에 작성해야함. item들이 위에서 부터 맞아떨어지면 작동되는걸로 구글링할때 봤음.
if - else if 구문이라 봐야함.
 
다크모드에 따라 다른 컬러를 지원하려면 selector들의 night 리소스를 파면 될 듯 함?
 
// backgrounTint 바꾸는 selector

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:color="?attr/colorPrimary" />
    <item android:color="@color/button_enable_false_tint" />
</selector>

 
 
selector에서는 색깔 속성을 android:color을 쓰고,
style에서 적어둔거에 따라 다른 컬러가 되는 것 같다.
 
여기서, ?attr/colorPrimary
?attr은 이 앱에 적용된 Theme의 Style내에 작성된 attribute, 즉, item들을 참조해오는 키워드임
 
테마는 다크모드 적용해서 주요 색상 쓰게 될테니, ?attr로 재활용하면 될 듯함.
 
attr이 커스텀뷰를 만들때도 사용되던데, 그 부분은 모르겠당..
 
==========================================
 

// 4. Colors.xml 파일에서 원하는 컬러 만들기

 

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="purple_200">#FFBB86FC</color>
    <color name="purple_500">#FF6200EE</color>
    <color name="purple_700">#FF3700B3</color>
    <color name="teal_200">#FF03DAC5</color>
    <color name="teal_700">#FF018786</color>
    <color name="black">#FF000000</color>
    <color name="white">#FFFFFFFF</color>

    <color name="button_enable_false_textcolor">#8B8B8B</color>
    <color name="button_enable_false_tint">#E0E0E0</color>
</resources>

 
 
=================================
 
(대충 오늘 일기)
 
근데, 나의 문제는
클릭했을때 바뀌는걸 하고싶었는데,
누르고 있을때만 바뀌는것이었고... 
selector에 여러가지 옵션들중에서 내가 원하는거는 안보인다..... 
 
예전에도 selector 만들어봤는데...?
나는 왜 이거를 만드려고 찾고 있었을까????
 
 
티스토리가 코드블록에서도 bold체를 줄 수 있으면 더 좋았을텐데,,,,
코드블록을 안쓰고 그냥 text로 붙여야하나 궁시렁..
 
=================================
 

 


혹시 보다가 막히는거 있으면 댓글 달아주세요.