안녕하세요 통키입니다.
안드로이드 프로젝트를 하면서 하나하나 배워가던중에 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() 비교를 하니
요것만 주의해서 사용 하시면 될 것 같습니다.
'IT > 안드로이드' 카테고리의 다른 글
Android Kotlin에 대한 개인적인 생각 (0) | 2022.10.27 |
---|---|
안드로이드 앱에서 웹뷰로 데이터 전송 (0) | 2015.11.17 |
순서대로 처리되는 동적리시버 (0) | 2015.08.17 |
안드로이드 개발에 발을 들이다 (0) | 2015.05.04 |
지니모션-Geny motion 모바일 앱을 pc에서 실행 (1) | 2015.01.19 |