본문 바로가기

프로그래밍/Android

커스텀속성과 R.styleable

R.styleable

 

xml을 사용하다보면 android:layout_width , android:layout_height 등 android: 로 정의된

각 속성을 정의하게 되어있다.

 

나만의 레이아웃이나 뷰를 커스텀하게 사용하고자 하는경우

추가로 요구되는 값들이 생길텐데 이러한 값을 xml에서 입력하고자 할때

어케 할까?

 

예제는 TextButton 에 대한 포스팅에 잘 나와있다.

 

이번 포스팅은 커스텀 styleable에 대한 내용만 정리해 본다~

 

1. 나만의 styleable 을 정의하기

해당 내용을 정의할 xml 파일을 만든다. ( my_layout_styleable.xml )

 

<?xml version="1.0" encoding="utf-8"?>

<resources>

<declare-styleable name="MyLayoutAttribute">

<attr name="value" format="integer"/>

<attr name="color" format="integer"/>

<attr name="run" format="boolean"/>

</declare-styleable>

</resources>

요렇게하면 MyLayoutAttribete 라는 이름으로 3개의 값을 가지고 있는 styleable이

생겨난다.

R.java 를 살펴보면

R.styleable.MyLayoutAttribute

R.styleable.MyLayoutAttribute_value

R.styleable.MyLayoutAttribute_color

R.styleable.MyLayoutAttribute_run

 

각각의 아이디가 부여된 것을 알수있다.

 

2. 레이아웃 클래스 생성

원하는 레이아웃을 상속받은 클래스를 하나 만든다.

그리고, 각 속성값을 저장할 변수들을 선언하고, getter/setter 를 설정한다.

getter/setter는 옵션사항이지만 기존 레이아웃들과 비슷한

모양새를 갖추고, 동적으로 레이아웃을 생성하는 경우를 고려해 만들어 준다.

 

(기존 레이아웃 항목과 겹칠 수 있으니 멤버 어트리뷰트명은 알아서 잘 할것!! -_-;)

 

public class MyTestLayout extends LinearLayout { 

private int value=0;

private int color=0;

private boolean run=false;

 

public int getValue() {

return innerColor;

}

 

public void setValue(int value) {

this.value = value;

}

 

public int getColor() {

return color;

}

.

.

.

.

 

}

 

3. 생성자를 구현한다.

레이아웃이나 뷰를 상속받으면 구현해야 하는 생성자가 1개가 아니다.

옹~ 레이아웃의 경우 2개인데..

 

public MyTestLayout(Context context, AttributeSet attrs);

public MyTestLayout(Context context);

 

요 두녀석이다.

 

일반적으로 사용되는 녀석은 당연 윗녀석~

xml에서 여러 속성이 부여되는데 해당 정보가 생성자에 전달된다.

따라서, 위의 생성자에 속성정보를 얻는 코드가 추가되어야 한다.

 

obtainStyledAttributes() 메쏘드로 위에 정의한 styleable을 얻고,

하위항목은 각 항목별로 형식에 맞는 메쏘드로 실제 데이터를 읽어온다.

 

public MyTestLayout(Context context, AttributeSet attrs) {

super(context, attrs);

// TODO Auto-generated constructor stub

// 속성값을 읽어 변수에 저장

TypedArray ta = getContext().obtainStyledAttributes(attrs

R.styleable.MyLayoutAttribute);

 

innerColor = ta.getInteger(R.styleable.MyLayoutAttribute_value, 0);

borderColor = ta.getInteger(R.styleable.MyLayoutAttribute_color, 0);

isAntiAlias = ta.getBoolean(R.styleable.MyLayoutAttribute_run, false);

}

 

 

4. 레이아웃 xml에서 속성에 값넣기

레이아웃 태그에는 네임스페이스를 지정할 수 있다. 안드로이드는

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

 

요렇게 되어있는데 android 라는 네임스페이스를 사용하겠다라는 의미~

이곳에 메인 패키지로 네임스페이스를 추가한다.

그리고,, 그냥 사용하면 된다. -_-;;;

 

<com.your.package.MyLayout 

xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:myspace="http://schemas.android.com/apk/res/com.your.package"

 

android:layout_width="wrap_content"

android:layout_height="wrap_content"

myspace:value="1"

myspace:color="ff303030"

myspace:run="false">

 

.

.

 

</com.your.package.MyLayout>

'프로그래밍 > Android' 카테고리의 다른 글

LayoutInflater를 사용해 레이아웃 구성하기  (0) 2009.12.15
액티비티 변경 에니메이션  (0) 2009.12.06
Animation 관련 샘플  (0) 2009.12.06
ViewFlipper로 뷰 교체하기  (0) 2009.12.06
에니메이션 interpolater  (0) 2009.12.06
Splash window 보이기  (0) 2009.11.24
TextButton 만들기  (0) 2009.11.22
버튼 상태에 따른 배경변경  (0) 2009.11.22
에니메이션 처리하기  (0) 2009.11.19
투명한 레이아웃 만들기  (0) 2009.11.18