안드로이드 신입 면접 질문에 대해 검색해 보면 간간이 보이는 키워드가 커스텀뷰다... 그래서 커스텀 뷰를 만들어 보려고 한다.!ㅎ
개발하는 애플리케이션의 요구 조건에 따라 화면 구성 요소에 요구하는 바도 조금씩의 차이가 발생한다. 안드로이드 프레임워크에서 제공하는 API를 사용하여 화면이 구성된다면 간단하고 좋겠지만, 현실은 그러지 못하다. 그렇기 때문에 커스텀 뷰가 필요하다. 화면을 구성할 적절한 뷰가 없을 때 개발자는 커스텀 뷰를 만들어 사용할 수 있다.
목적 또는 구현에 따라 커스텀 뷰를 만드는 방법은 3가지가 있다.
class ChangeColorTextView : AppCompatTextView {
var dustDimension = 0
set(value) {
field = value
setLevelColor()
}
constructor(context: Context?) : super(context)
constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs)
constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int)
: super(context, attrs, defStyleAttr)
private fun setLevelColor(){
when{
dustDimension > 150 -> this.setTextColor(Color.RED)
dustDimension in 31..150 -> this.setTextColor(Color.GREEN)
else -> this.setTextColor(Color.BLUE)
}
}
}
여러 뷰 요소를 합쳐서 한 번에 출력하기 위해 생성하는 커스텀 뷰
: 여러 뷰가 결합된 형태로 반복해서 사용될 경우 하나의 뷰로 만들어서 사용하는 것이 편리하므로 커스텀 뷰를 생성한다.
CustomView를 만들어서 재사용하기
기존에 존재하지 않는 형태의 새로운 뷰를 생성하는 커스텀 뷰
: 기존의 API에 존재하지 않는 새로운 형태의 뷰를 만들어 사용 해야 하기 때문에 커스텀 뷰를 생성한다. View 클래스를 상속받아 구현한다.
위의 코드에서 생성자가 3개나 있는 것을 볼 수 있는데 이는 자바 코드에서 생성자를 통해 뷰를 생성할 경우뿐만 아니라 레이아웃 xml코드에서 뷰를 생성하는 경우를 생각하여 시스템이 호출할 수 있는 생성자를 추가한 것이다. 또한, xml에서 커스텀 뷰를 사용하고자 하는 경우 패키지 명부터 커스텀 뷰의 클래스 명을 입력하여 사용해 주어야 한다.
<com.hyejineee.customview.ChangeColorTextView
android:id="@+id/dust_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
my:dimension = "100"/>
또한 위 xml코드에서 my:dimension
과 같은 커스텀 속성을 사용하고자 하는 경우 다음과 같이 커스텀 속성에 대한 정의를 하여 빌더에 의해 속성이 인식되도록 해주어야 한다.
declare-styleable
태그는 하위 속성들을 관리하는 단위를 의미한다.attr
태그는 정의하는 커스텀 속성을 의미한다.name
속성은 커스텀 속성의 이름을 나타낸다.format
속성은 커스텀 속성 값의 타입을 나타낸다.<resources>
<declare-styleable name ="dustTextView">
<attr name ="dimension" format ="integer ">
</declare-styleable>
</resources>
View 클래스를 상속하여 도넛 모양의 커스텀 뷰를 만들어 보자. 만드는 순서는 다음과 같다.
커스텀뷰 유용하겠군요, 좋은 정리 감사합니다.