Android Custom State 만들기. |
selector 를 이용하면 코드에서 번잡스럽게 해결해야 하는 state 에 따른 resource change 를 아주 쉽게 처리할 수 있다.
하지만, 몇몇 view 에서는 우리가 원하는 모든 state 를 지원하지 않는다.
예를 들면 LinearLayout 은 state_selected 에 대한 값을 가지고 있지 않다.
만약 state_selected 를 LinearLayout 에도 지원하고 싶다면, 다음과 같이 작성하면 된다.
public class SelectableLinearLayout extends LinearLayout{
private static final int[] ADDITIONAL_STATES = { android.R.attr.state_selected };
private boolean mIsSelected;
...
@Override
public int[] onCreateDrawableState( int extraSpace ){
int[] drawableState = super.onCreateDrawableState( extraSpace + ADDITIONAL_STATES.length );
if ( mIsSelected )
mergeDrawableStates( drawableState, ADDITIONAL_STATES );
return drawableState;
}
@Override
public void setSelected( boolean selected ){
super.setSelected( selected );
if ( mIsSelected != selected ){
mIsSelected = selected;
refreshDrawableState();
invalidate();
}
}
...
}
만약에 이렇게 다른 view 에서는 기본으로 지원되지만, 일부 view 에서만 지원되지 않는 state 를 떠나서, 새로운 state 를 만들고 싶다면..
일반적인 custom attribute 생성 절차를 따르면 된다.
< res/values/attrs.xml >
<resources>
...
<declare-styleable name="MyState">
<attr name="state_my" format="boolean" />
</decalre-styleable>
...
</resources>
Custom Attribute 의 적용은 아래와 같이 하면 된다.
<res/drawable/my_selector.xml>
<selector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:my="http://schemas.android.com/apk/res/com.test.mystate">
...
<item my:state_my="true" android:drawable="@drawable/my_state" />
...
</selector>
'프로그래밍 놀이터 > 안드로이드, Java' 카테고리의 다른 글
[Android] activity-alias 태그를 사용하는 좋은 예. (0) | 2014.06.06 |
---|---|
Cannot use SessionLoginBehavior SSO_WITH_FALLBACK when com.facebook.LoginActivity is not declared as an activity in AndroidManifest.xml (0) | 2014.06.04 |
android - drag and drop sort ( reordering ) listview (0) | 2014.05.31 |
난독화 ( proguard ) 에 대한 고급정보. (0) | 2014.05.30 |
Glide - Android Image Loading Open Source Library. (0) | 2014.05.30 |
댓글