안드로이드 Custom View

이영준·2023년 4월 4일
0

특정 뷰를 만들었는데 이것이 재사용성이 높은 경우 아예 custom view로 설정하여 사용하면 편리하다.

  • 기존 View 클래스를 상속받아 작성한다.
  • Context와 AttributeSet을 매개변수로 하는 생성자를 구성한다. -> 안드로이드 스튜디오가 뷰와 상호 작용하기 위해 필요하다.

커스텀 뷰를 만들기 위해 먼저 원하는 레이아웃을 그리고

사진파일, 삼성, 홍길동과 같이 변수로 할당할 값들을 묶어줄 attrs 파일이 필요하다.

🔑 attrs.xml로 사용할 속성 정의

<?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="활빈당" />

위와 같이 넣어서 속성값을 넣어줄 수 있다.

profile
컴퓨터와 교육 그사이 어딘가

0개의 댓글