본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[Android] Custom View 를 사용할 때 수동 inflate, merge, attribute setting 피하는 방법.

by 돼지왕 왕돼지 2014. 4. 12.
반응형


 [Android] Custom View 를 사용할 때 수동 inflate, merge, attribute setting 피하는 방법.

 

[Android] Custom View 를 사용할 때 수동 inflate, merge, attribute setting 피하는 방법.


http://trickyandroid.com/protip-inflating-layout-for-your-custom-view/


보통의 Custom View 는 ViewGroup ( LinearLayout, RelativeLayout, FrameLayout 등 ) 을 상속하여, 여러가지 component 들을 가지고 있는다. 이 경우 보통은 최초 로딩시 inflate 를 통해서 layout 을 불러온다.

이 때 root viewgroup 이 custom view 가 상속한 viewgroup 과 같다면, merge 를 사용하여 view hierarchy 를 조금 더 최적화 할 수 있다. 하지만, 이 경우에는 merge 에 지정된 속성들이 반영되지 않아, 수동으로 attribute 를 지정해줘야 한다. ( xml 로 style 을 정의할 수도 있다. )


 manual inflate, merge, attribute setting 등을 피하는 것은 다음의 방법을 사용하면 된다.


<com.trickyandroid.views.Card xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"

    android:layout_height="wrap_content"

    android:padding="@dimen/card_padding"

    android:background="@color/card_background">


    <ImageView

        android:id="@+id/thumbnail"

        android:src="@drawable/thumbnail"

        android:layout_width="72dip"

        android:layout_height="72dip"

        android:scaleType="centerCrop"/>


    <TextView

        android:id="@+id/title"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="Card title"

        android:layout_toRightOf="@+id/thumbnail"

        android:layout_toLeftOf="@+id/icon"

        android:textAppearance="@android:style/TextAppearance.Holo.Medium"

        android:layout_marginLeft="?android:attr/listPreferredItemPaddingLeft"/>


    <TextView

        android:id="@+id/description"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="Card description"

        android:layout_toRightOf="@+id/thumbnail"

        android:layout_below="@+id/title"

        android:layout_toLeftOf="@+id/icon"

        android:layout_marginLeft="?android:attr/listPreferredItemPaddingLeft"

        android:textAppearance="@android:style/TextAppearance.Holo.Small"/>


    <ImageView

        android:id="@+id/icon"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:src="@drawable/icon"

        android:layout_alignParentRight="true"

        android:layout_centerVertical="true"/>


</com.trickyandroid.views.Card>



단, 이 녀석의 경우는 코드에서 해당 component 를 new 를 통해 생성하는 것이 어렵고,

xml 에서 이 녀석을 포함하는 경우에는 include 를 사용하여 약간의 가독성을 떨어뜨릴 수 있다.

( include 의 경우 attribute 가 중복되어 어떤 녀석이 적용되는지를 한눈에 알기 어려운 경우도 있다. )




결론


Custom View 가 ViewGroup 이며, xml 형태로만 load 가 되는게 확실하다면,

코드의 간결성 등의 목적으로 위와 같은 방법을 쓸 수 있겠다.


하지만 범용적으로 사용하려면, 조금은 귀찮더라도 manual inflating, merge, attribute setting 을 해주는것이 좋겠다.






반응형

댓글