특정 뷰를 만들었는데 이것이 재사용성이 높은 경우 아예 custom view로 설정하여 사용하면 편리하다.
커스텀 뷰를 만들기 위해 먼저 원하는 레이아웃을 그리고
사진파일, 삼성, 홍길동과 같이 변수로 할당할 값들을 묶어줄 attrs 파일이 필요하다.
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="CustomNameCard">
<attr name="userImg" format="integer|reference" />
<attr name="userOrg" format="string"/>
<attr name="userName" format="string"/>
</declare-styleable>
</resources>
class CustomNameCard : ConstraintLayout {
lateinit var iv: ImageView
lateinit var name: TextView
lateinit var org: TextView
constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {
init()
getAttrs(attrs)
}
private fun init() {
val view = LayoutInflater.from(context).inflate(R.layout.custom_name_card_view, this, false)
addView(view);
iv = findViewById(R.id.user_img_iv)
name = findViewById(R.id.userName)
org = findViewById(R.id.user_org_tv)
}
// attrs.xml 파일로부터 속성 정보 확보 - typedArray
private fun getAttrs(attrs: AttributeSet) {
val typedArray = context.obtainStyledAttributes(attrs, R.styleable.CustomNameCard)
setTypedArray(typedArray)
}
// 속성값을 view 요소들에 연결
private fun setTypedArray(typedArray: TypedArray) {
name.text = typedArray.getText(R.styleable.CustomNameCard_userName)
org.text = typedArray.getText(R.styleable.CustomNameCard_userOrg)
iv.setImageResource(
typedArray.getResourceId(
R.styleable.CustomNameCard_userImg,
R.drawable.ic_launcher_foreground
)
)
typedArray.recycle()
}
}
내가 정의한 속성들을 getAttrs 함수를 정의하여 가져온다음
setTypedArry로 xml로 만든 뷰의 요소들에 넣어지게 한다.
이렇게 만든 customNameCard를 다른 xml 상에서
<com.ssafy.userinterface_4.custom.CustomNameCard
android:id="@+id/nameCard_hong"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:userImg="@drawable/ic_person_add_black_24dp"
app:userName="홍길동"
app:userOrg="활빈당" />
위와 같이 넣어서 속성값을 넣어줄 수 있다.