Android에서 AttributeSet은 XML 레이아웃 파일에서 정의된 뷰(View)의 속성(Attribute)을 가져오는 데 사용되는 인터페이스입니다.
AttributeSet은 안드로이드 시스템에 의해 뷰가 인플레이션(화면에 뷰를 그리는 것)될 때 자동으로 생성되는데요. 그렇다면 자동으로 생성되는 AttributeSet을 정의해서 사용할 수 없을까요?
이번 시간은 AttributSet을 정의해서 사용 하는 방법에 대해서 알아보겠습니다.
AttributSet이란?
기본적으로 XML 레이아웃 파일에서 뷰의 속성을 지정할 때 다음과 같이 사용할 것입니다.
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/myTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="AttributSet" />
</LinearLayout>
그리고 이러한 속성들은 AttributeSet을 통해 자바 코드에서도 접근할 수 있습니다.
TextView myTextView = findViewById(R.id.myTextView);
CharSequence text = myTextView.getText();
findViewById()
를 통해 레이아웃에 정의된 뷰를 찾고, 해당 뷰의 속성을 getText()
메서드를 통해 가져옵니다. 그리고 setText()
메서드를 활용해서 뷰의 속성 값을 변경 할 수도 있습니다.
Custom AttributeSet 하는 방법은 무엇일까?
정의된 속성이 아닌 직접 속성을 생성하여 AttributeSet에 등록할 수 있습니다.
먼저 attrs.xml
을 생성하여 Attribute을 정의할 수 있습니다.
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="AttributSetTestView">
<attr name="actionType" format="reference|string" />
</declare-styleable>
<declare-styleable name="TestView">
<attr name="viewType" format="reference|integer">
<enum name="frame" value="0" />
<enum name="detail" value="1" />
</attr>
</declare-styleable>
</resources>
declear-styleable
의 name
에 Attribute 을 사용할 View의 Class Name 을 선언합니다.
attr
의 name
을 통해 Attribute Name을 설정하고, format
에 자료형을 설정합니다. attr
을 <enum name="frame" value="0" />
과 같이 enum
으로 등록하여 사용할 수도 있습니다. 여기서 주의할 점은 attr
에 선언한 format
에서 선언한 자료형과 일치하는 값을 넣어야합니다.
설정한 AttributeSet인 actionType
을 xml 에 넣어서 사용하려면 app:actionType
으로 선언하여 설정할 수 있습니다. 이 때 actionType
의 format
은 attrs.xml
에서 설정한 format
으로 맞춰주셔야 합니다.
<com.test.lab.AttributeSetTestView xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/view_test"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:actionType="Hello, Attribute" />
이제 설정한 xml의 AttributeSet 을 Source Programmatically 하는 방법은 Context의 obtainStyledAttributes
을 사용하여 TypedArray
을 가져오고 AttributeSet에 설정한 Format에 맞춰서 가져오면 됩니다. 예를들어 attr의 format을 String 으로 설정하였으면 TypedArray.getString으로 가져오면 됩니다.
TypedArray typedArray = getContext().obtainStyledAttributes(attrs, R.styleable.AttributSetTestView);
String actionType = typedArray.getString(R.styleable.TvVideoView_videoType);
마무리
XML에 정의된 위젯에 사용자 지정 AttributeSet을 설정하고 이를 활용하는 방법은 Android 앱 개발에서 유용한 기술 중 하나입니다. 특히, 여러 개발자가 협업하여 공통된 뷰를 만들고 공유하는 경우, AttributeSet을 활용하면 공통 뷰의 설정을 XML에서 직접 지정할 수 있어 코드의 가독성을 높이고 중복 코드를 줄일 수 있습니다.
AttributeSet을 사용하고 있지 않는다면, 프로젝트에 적용해보는 것도 추천드립니다.