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>


+ Recent posts