마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

커스텀뷰의 어트리뷰트 설정 질문좀 드립니다

0 추천

LinearLayout내에서 사용할 커스텀뷰를 만들고 있는데 리니어레이아웃 내에서

자식 커스텀뷰들을 선택 여부를 확인할 방법 추가해야하는 상황입니다. 나중에 선택여부를 확인해

선택된 커스텀뷰의 텍스트들을 꺼내어 다른곳으로 보낼 예정입니다.

 

아무튼 이런 상황에서 단순히 두가지 방법이 생각났는데.

1. 커스텀뷰 클래스 내에 변수를 하나 정의후 선택되었는지 안되었는지 알 수 있는 메소드 정의후 리턴한다.

2. 커스텀뷰의 attrs xml 파일내에 체크관련 새로운 속성을 정의한다

 

처음에는 2번으로 하려고

<resources>
    <declare-styleable name="BodyPartCustomView">
        <attr name="part" format="string" />
        <attr name="isSelected" format="boolean" />
    </declare-styleable>
</resources>

이 같은 코드를 만들었는데... format 그러니까 타입이 boolean으로 설정했음에도

커스텀뷰 내에서

var isChecked = cvAttrs.getText(R.styleable.BodyPartCustomView_isSelected)

이런식으로 불러오니 isChecked가 Boolean 타입이 아니라  CharSequence 타입이 되어 문자열 처럼 사용해야하는 것이었습니다.

이렇게되면 선택되고 안되었을때 매번 문자열로 true false를 검사해야할것같고 해서 더 복잡해질것같아서

 

1번방향으로 틀었는데 괜찮을까요..?

마침 isSelected라는 이름으로 메소드를 정의하려고하니 이미 View 클래스내에 정의가 되어있어 오버라이드하면 되었습니다..그래서 변수를 정의하고 선택될때마다 선택되었는지 안되었는지 판별할 생각인데 괜찮을까요?

소스는 대충

class BodyPartCustomView @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyle: Int = 0): FrameLayout(context, attrs, defStyle) {

    private val part: TextView by lazy { findViewById(R.id.part) }
    private val img: ImageView by lazy { findViewById(R.id.state) }
    var isChecked: Boolean = false

    init {
        LayoutInflater.from(context).inflate(R.layout.body_part_custom_view, this)
        init(attrs, defStyle)
    }
    
    private fun init(attrs: AttributeSet?, defStyle: Int) {
        val cvAttrs = context.obtainStyledAttributes(
            attrs, R.styleable.BodyPartCustomView, defStyle, 0
        )

        val partValue = cvAttrs.getText(R.styleable.BodyPartCustomView_part)
        part.text = partValue

        this.setOnClickListener {
            img.visibility =
                if (img.visibility == View.INVISIBLE) {
                    isChecked = true
                    View.VISIBLE
                }
                else {
                    isChecked = false
                    View.INVISIBLE
                }
        }
    }
    override fun isSelected(): Boolean = isChecked
}

 

이러한 형식으로 될것같습니다..

codeslave (3,940 포인트) 님이 2021년 5월 20일 질문
속성타입은 boolean으로 하셨으면 getBoolean으로 읽어오시면 됩니다.
Custom view가 어떤 모양인지 정확히는 모르겠지만 지난 번에 올리신 질문을 기준으로 볼 때, RadioButton, CheckeBox, ButtonGroup, Chip 등 선택했을 때 알 수 있는 기능이 기본으로 들어가 있는 뷰를 부모로해서 custom selector를 설정하시면 별도의 변수를 설정할 필요없이, 원하시는 결과물을 얻을 수도 있지않나 생각합니다. 저는 RadioButton을 이 방법으로 사용하고 있습니다.

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...