본문 바로가기

IT/안드로이드

안드로이드 View에 getTag(),setTag()사용하기

안녕하세요 통키입니다.

 

안드로이드 프로젝트를 하면서 하나하나 배워가던중에 Adapter를 사용해 리스트뷰를 뿌리는 부분을 구현하게 되었습니다.

 

구현중에 각 아이템을 클릭했을때 이벤트와 각 row에 들어있는 버튼을 클릭했을때의 이벤트가 필요하게 되어 구글링을 하던중에

getTag(),setTag()사용법에 대한 내용을 보게 되어 간략히 정리해두기로 합니다.

 

{{dlucky님의 블로그에서 발췌}}

 

[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() 비교를 하니
요것만 주의해서 사용 하시면 될 것 같습니다.