본문 바로가기

모바일프로그래밍/Android

Custom Widget에 사용자 속성 정의 및 사용하기


커스텀 위젯에 사용자 속성을 정의하려면 아래의 순서를 따라야 합니다.

1. res/value/attrs.xml 에 사용자 속성을 정의
2. xml에서 사용자 속성을 사용하기 위한 namespace를 지정한 후 커스텀 위젯의 속성에 사용자 속성을 정의
3. 커스텀 위젯 소스코드(.java)에서 사용자 속성의 값을 가져와 사용





attrs.xml에 사용자 속성 정의  

아래와 같이 declare-styleable 태그 안에 attr 태그로 사용자 속성을 정의합니다. declare-styleable 태그안의 name 속성은 커스텀 위젯 소스코드(.java)에서 사용자 속성의 값을 가져오기 위해 사용됩니다. 
<?xml version="1.0" encoding="utf-8"?>
<resources>
	<declare-styleable name="DragButton">
	    <attr name="button_src" format="reference"/>
	</declare-styleable>    
</resources>

attr 태그의 format 속성의 값으로는 boolean, integer, float, dimension, reference(id값), string, color(색상코드값), fraction, enum, flag 등이 사용될 수 있습니다.




xml의 커스텀 위젯에 사용자 속성 정의  

커스텀 위젯에 사용자 속성을 정의합니다. 이를 위해서는 먼저 사용자 속성을 사용하기 위한 네임스페이스를 지정해 주어야 합니다. (android 는 안드로이드에서 기본으로 제공하는 속성을 사용하기 위한 네임스페이스입니다.)

네임스페이스의 지정은 루트 태그안에 다음과 같이 명시하면됩니다. 이때 네임스페이스명은 자신이 원하는 이름으로 지정하면 되고, 애플리케이션의 패키지명 또한 정확히 지정해 주어야 합니다. (커스텀 위젯 소스코드의 패키지명이 아니라 애플리케이션의 패키지명임을 주의해야 합니다.)

xmlns:네임스페이스명="http://schemas.android.com/apk/res/애플리케이션의 패키지명"


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:dragbutton="http://schemas.android.com/apk/res/com.plasticradio.footballtvguide"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >
    <TextView 
        android:id="@+id/alarm_tv_test"
        android:layout_alignParentLeft="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <com.plasticradio.widget.DragButton
		android:id="@+id/alarm_dragButton"
		android:layout_below="@id/alarm_tv_test"
		dragbutton:button_src="@drawable/drag_button_normal"
		android:layout_width="fill_parent"
		android:layout_height="fill_parent" />
</RelativeLayout> 




커스텀위젯 소스코드에서 사용자 속성 사용  

커스텀 위젯 소스코드(.java)의 생성자에서 context, attr 파라미터 값을 이용해 TypeArray 객체를 생성한 후 이로 부터 xml에 정의했던 사용자 속성을 가져와 사용합니다.
public DragButton(Context context, AttributeSet attr) {
super(context, attr); //위젯의 Attribute 값을 가져와서 변수에 저장 TypedArray typedArray = context.obtainStyledAttributes(attr, R.styleable.DragButton); int dragBtnId = typedArray.getResourceId(R.styleable.DragButton_button_src, 0); }




참고 : 호군의 "Code 속으로"