코딩 일기장/Android(Kotlin)

[Android/Kotlin]CustomView: color 속성 추가하기

minWachya 2022. 4. 26. 14:33
반응형

저번에 CustomView를 만드는 법을 간단하게 올린 적이 있는데

https://min-wachya.tistory.com/191

 

[Android/Kotlin]Custom View 만들기/Spinner처럼 생긴 TextView 만들기/ClickListener 추가

아래 UI는 "동네 고영희" 앱 UI입니다! 1, CustomView의 layout 생성 res>layout>custom_spinner_text_view.xml <?xml version="1.0" encoding="utf-8"?> 2, res>values>attrs.xml(없으면 생성) 내가 필요한 속..

min-wachya.tistory.com

이번엔 color 속성도 추가하는 법을 올리려고 한다.


이건 CustomView의 xml이다

<?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"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="20dp">

    <TextView
        android:id="@+id/tvNum"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/list_item_close_num"
        android:textSize="30sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/tvText"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="20dp"
        android:text="@string/list_item_close_text"
        android:textSize="18sp"
        android:layout_marginEnd="20dp"
        app:layout_constraintBottom_toBottomOf="@+id/tvNum"
        app:layout_constraintEnd_toStartOf="@+id/checkBox"
        app:layout_constraintStart_toEndOf="@+id/tvNum"
        app:layout_constraintTop_toTopOf="@+id/tvNum" />

    <CheckBox
        android:id="@+id/checkBox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:buttonTint="@color/purple_200"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

이건 위 CustomView의 속성!! (values>attrs.xml)

btnInt_basic 부분을 추가해서 format을 reference|color로 설정했다.

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!--기본 커스텀 뷰-->
    <declare-styleable name="CustomBasicView">
        <attr name="num_basic" format="reference|string" />
        <attr name="text_basic" format="reference|string" />
        <attr name="btnTInt_basic" format="reference|color" />
    </declare-styleable>
</resources>

CustomView.kt이다.

색 설정 부분은 setTypeArray() 함수의 // 체크박스 색 < 주석 부분!!

package com.example.mycalculate.custom

import android.content.Context
import android.content.res.ColorStateList
import android.content.res.TypedArray
import android.graphics.Color
import android.os.Build
import android.util.AttributeSet
import android.util.Log
import android.view.LayoutInflater
import android.widget.CheckBox
import android.widget.TextView
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.widget.CompoundButtonCompat
import com.example.mycalculate.R


// 기본 위젯(순서+내용+체크박스)
class CustomBasicView : ConstraintLayout {
    // 커스텀 뷰 안에 들어가는 아이템
    lateinit var tvNum: TextView         // 순서
    lateinit var tvText: TextView        // 내용
    lateinit var checkBox: CheckBox      // 체크박스

    // 생성자
    constructor(context: Context?) : super(context!!){
        init(context)
    }
    constructor(context: Context?, attrs: AttributeSet?) : super(context!!, attrs){
        init(context)
        getAttrs(attrs)
    }

    // 초기화
    private fun init(context:Context?) {
        val view = LayoutInflater.from(context).inflate(R.layout.custom_basic_view,this,false)
        addView(view)
        tvNum = view.findViewById(R.id.tvNum)
        tvText = view.findViewById(R.id.tvText)
        checkBox = view.findViewById(R.id.checkBox)
    }

    // 속성 가져오기
    private fun getAttrs(attrs: AttributeSet?){
        val typedArray = context.obtainStyledAttributes(attrs, R.styleable.CustomBasicView)
        setTypeArray(typedArray, attrs)
    }

    // 속성 사용하기
    private fun setTypeArray(typedArray : TypedArray, attrs: AttributeSet?) {
        // 순서: CustomBasicView 이름으로 만든 attrs.xml 속성중 num_basic 참조
        val num = typedArray.getText(R.styleable.CustomBasicView_num_basic)
        tvNum.text = num

        // 내용: CustomBasicView 이름으로 만든 attrs.xml 속성중 text_basic 참조
        val text = typedArray.getText(R.styleable.CustomBasicView_text_basic)
        tvText.text = text

        // 체크박스 색: CustomBasicView 이름으로 만든 attrs.xml 속성중 btnTInt_basic 참조
        val a = context.obtainStyledAttributes(attrs, R.styleable.CustomBasicView)
        val btnTIntColor = a.getColor(R.styleable.CustomBasicView_btnTInt_basic, 0xFFBB86FC.toInt())
        checkBox.buttonTintList = ColorStateList.valueOf(btnTIntColor)

        typedArray.recycle()
        a.recycle()
    }
}

글케 어려운 내용은 아니었는데... 꽤 시간을 잡아먹음

이유: ...사실 CustomView를 되게 많이 만들어놨고 그 CustomView마다 btnTInt 속성을 만들어 놨는데,,,,,,,,,,,,,,,,, 색상 변경해 둔 게 어느 CustomView였는지 헷갈려서^_<

반응형