Holder Pattern 사용하면서 알게된 Tag..이럴수가..
나는 그동안 뭘 하고 있었던가...........싶네요..
다음 부터는 태그를 많이 사용해야겟어요 !! -_ -v
[Intro]
오늘은 별거 아닌 팁 하나 포스팅 해봅니다.
정말 별거 없답니다. 아하하...
[Data in View]
가끔 어플리케이션을 만들다 보면 View안에 어떤 데이터를 집어 넣고 싶을 때가 종종 있습니다.
네... 있지요. 그런 경우 그냥 무작정 떠올릴 수 있는 방법은 extends 해버리는 겁니다.
OOP의 최대 장점이지요.
Id, Name, Address 세개의 정보를 View안에 담고 싶다고 한다면
아마 다들 아래와 같이 클래스를 만드실 겁니다.
public class CustomView extends View {
private int mId;
private String mName;
private String mAddr;
public CustomView(Context context) {
super(context);
}
public CustomView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public int getId() { return mId; }
public void setId(int id) { mId = id; }
public String getName() { return mName; }
public void setName(String name) { mName = name; }
public String getAddress() { return mAddr; }
public void setAddress(String addr) { mAddr = addr; }
}
별로 복잡하지 않은 구조입니다.
달랑 필드 세개에 get / set 메소드 하나씩 달려 있는 모양이지요.
사용법은 아래와 같이 그냥 get / set 메소드를 사용 하면 되는 겁니다.
CustomView customView = new CustomView(this);
customView.setId(1);
customView.setName("vizpei");
customView.setAddress("somewhere");
이와 같은 방법은 단순히 get/set 만 하지 않고 뭔가 좀더 복잡한 operation을 하는 경우에
아주 유용하게 쓰는, 그냥 평범하게 생각 할 수 있는 customization 이지요.
[Tag in View]
android.view.View, 즉 모든 View들의 상위에 있는 View 클래스에는
getTag() / setTag() 를 사용하여 View에 Tag를 붙일 수 있습니다.
Tag는 Object 타입이라 아무거나 다 들어 갈 수 있지요.
그냥 시시한 값 하나 넣을 수도 있지만 복잡한 클래스 인스턴스도 가볍게 넣을 수 있습니다.
아까 넣고 싶었던 데이터들을 일단 하나의 클래스로 만들어 봤습니다.
필드를 private로 만들고 get / set 메소드 만들어도 되지만 그냥 public으로 해버렸습니다.
어차피 그냥 데이터 저장용이니까요.
private class PersonInfo {
public int id;
public String name;
public String addr;
}
이제 PersonInfo 인스턴스를 만들고 View.setTag()로 집어 넣어주면 땡입니다.
PersonInfo pi = new PersonInfo();
pi.id = 1;
pi.name = "vizpei";
pi.addr = "somewhere";
View view = new View(this);
view.setTag(pi);
사용할때는 View.getTag() 로 가져오면 역시 땡이지요.
PersonInfo pi = (PersonInfo) view.getTag();
알면 유용하게 쓸 수 있지만, 모르면 맨날 extends만 하고 있을지는 모르는 일입니다.
[Appendix]
뭐 별로 쓴적은 없지만...
View.findViewWithTag() 를 사용하면 Tag로 View를 찾을 수 있답니다.
View.findViewById()로만 View를 찾을 수 있는건 아니란 것이지요.
다만 View.findViewWithTag()는 Object.equals() 비교를 하니
요것만 주의해서 사용 하시면 될 것 같습니다.
[출처] - http://blog.vizpei.kr/86999387
댓글 없음:
댓글 쓰기