티스토리 뷰

반응형

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 을 선언합니다.

attrname 을 통해 Attribute Name을 설정하고, format 에 자료형을 설정합니다. attr<enum name="frame" value="0" /> 과 같이 enum 으로 등록하여 사용할 수도 있습니다. 여기서 주의할 점은 attr에 선언한 format에서 선언한 자료형과 일치하는 값을 넣어야합니다.

 

설정한 AttributeSet인 actionType 을 xml 에 넣어서 사용하려면 app:actionType 으로 선언하여 설정할 수 있습니다. 이 때 actionTypeformatattrs.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을 사용하고 있지 않는다면, 프로젝트에 적용해보는 것도 추천드립니다.

반응형
댓글