코딩 일기장/Android(Kotlin)
[Android/Kotlin]CustomView: color 속성 추가하기
minWachya
2022. 4. 26. 14:33
반응형
저번에 CustomView를 만드는 법을 간단하게 올린 적이 있는데
https://min-wachya.tistory.com/191
이번엔 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였는지 헷갈려서^_<
반응형