관리 메뉴

나만을 위한 블로그

[Android] 태그란? 본문

Android

[Android] 태그란?

참깨빵위에참깨빵 2019. 11. 25. 15:39
728x90
반응형

https://itpangpang.xyz/274

 

setTag, getTag 사용하기(1) - findViewWithTag

setTag, getTag 사용하기(1) findViewWithTag ㆍ 이번글을 시작으로 Tag에 대해 한 3~4번정도 글을 쓰면서 알아보려고 합니다 ㆍ setTag, getTag를 잘 사용하면 View를 정말 효율적으로 제어할 수 있습니다. ㆍ 특..

itpangpang.xyz

 

태그 : (어떤 표시를 하기 위해 붙인) 꼬리표, 번호표 / 옷에 붙어있는 태그와 같은 의미다.

안드로이드의 태그 : 위의 태그와 별 다를 게 없는 의미.

 

- 사용법

 

View.setTag("원하는 이름");

 

이렇게 하면 해당 뷰의 고유 이름표가 뷰에 붙는다.

태그는 동적으로 뷰를 생성할 때 많이 쓰므로 동적으로 텍스트뷰와 버튼을 쓰는 예시를 들어보겠다.

 

public class MainActivity extends AppCompatActivity
{
LinearLayout ll; // 부모 레이아웃의 아이디값
TextView tv;     // 텍스트뷰 3개, 버튼의 각각의 아이디값
TextView tv2;
TextView tv3;
Button btn;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_main); <- xml이 필요없어서 이렇게 주석 처리를 한 것 같다.

 

/* 부모 레이아웃, 자식 뷰 매핑 */
ll = new LinearLayout(this);
tv = new TextView(this);
tv2 = new TextView(this);
tv3 = new TextView(this);
btn = new Button(this);

 

ll.setOrientation(LinearLayout.VERTICAL);
tv.setText("TextView1");
tv2.setText("TextView2");
tv3.setText("TextView3");
btn.setText("이것은 버튼");

ll.addView(tv);
ll.addView(tv2);
ll.addView(tv3);
ll.addView(btn);
setContentView(ll);
}
}

이렇게 만들면 아래의 화면이 나온다.

 

 

이 상태에서 태그를 달아본다.

텍스트뷰가 3개니까 각각의 뷰에 태그를 단다면

 

tv.setTag("tv1");
tv2.setTag("tv2");
tv3.setTag("tv3");

이런 모양이 될 것이다.

그럼 이걸 어떻게 활용하느냐가 문제다. setTag()로 태그를 다는 것까진 그렇다쳐도 이걸 얼마나 잘 활용하냐에 따라 효율성이 갈린다.

위의 메인 액티비티 예시 코드에서 버튼에 클릭리스너를 달아 텍스트뷰를 지워보겠다.

 

public class MainActivity extends AppCompatActivity
{
LinearLayout ll;
TextView tv;
TextView tv2;
TextView tv3;
Button btn;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_main);

ll = new LinearLayout(this);
tv = new TextView(this);
tv2 = new TextView(this);
tv3 = new TextView(this);
btn = new Button(this);

ll.setOrientation(LinearLayout.VERTICAL);
tv.setText("TextView1");
tv2.setText("TextView2");
tv3.setText("TextView3");

tv.setTag("tv1");
tv2.setTag("tv2");
tv3.setTag("tv3");

btn.setText("이것은 버튼");

btn.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
ll.findViewWithTag("tv1").setVisibility(View.GONE); // 리니어 레이아웃(부모 레이아웃)에서 tv1이라는 태그를 가진 뷰(텍스트뷰)를 찾고, setVisibility()로 해당 뷰를 GONE 상태로 만든다.
}
});

ll.addView(tv);
ll.addView(tv2);
ll.addView(tv3);
ll.addView(btn);
setContentView(ll);
}
}

여기서는 ll.findViewWithTag("tv1").setVisibility(View.GONE); 이 부분만 보면 된다.

findViewWithTag() : 위 코드에서 텍스트뷰는 리니어 레이아웃의 자식 뷰다. 그래서 자식의 태그를 써서 부모의 뷰에서 이 태그를 가진 뷰가 어딨는지 찾아주는 것이다.

 

tv1이라는 태그를 가진 뷰를 찾아서 setVisibility()로 뷰를 GONE 상태로 만든다고 이해하면 된다.

위 코드를 실행하면 아래와 같다.

 

 

tv1이란 태그를 가진 1번 텍스트뷰가 사라진 걸 확인할 수 있다.

그럼 텍스트뷰 3개를 다 지우려면 이렇게 하면 될 것이다.

 

btn.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{

// findViewWithTag()로 tv1, 2, 3이라는 태그를 갖는 뷰들을 GONE 상태로 만든다
ll.findViewWithTag("tv1").setVisibility(View.GONE);
ll.findViewWithTag("tv2").setVisibility(View.GONE);
ll.findViewWithTag("tv3").setVisibility(View.GONE);
}
});

일단 이렇게 하면 지우는 건 성공인데 뭔가 비효율적이다. 그럼 여기서 태그를 쓰면 된다.

태그를 tv1, 2, 3으로 달았으니 아래와 같이 수정해보자.

 

btn.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
int i = 1;
while(i<4)
{
ll.findViewWithTag("tv"+i).setVisibility(View.GONE); // 반복문을 통해 tv1, 2, 3까지의 태그를 갖는 뷰들을 찾아 GONE 상태로 만든다
i++;
}


}
});

빌드해보면 1번 텍스트뷰가 없어졌던 것처럼 3개의 텍스트뷰가 사라지는 걸 볼 수 있다.

여기서 좀 더 활용한다면 원하는 뷰에만 특정 태그를 달아서 원하는 뷰만 제어할 수도 있을 것이다.

 

다음 예제는 텍스트뷰 3개를 반복문을 통해 동적으로 만들고, 각 텍스트뷰마다 setTag()를 달고 태그를 활용해 클릭 이벤트를 받아보는 걸 한다.

예상 빌드 결과는 아래의 짤과 같다.

n번째 텍스트뷰라고 쓰인 텍스트뷰를 누르면 토스트로 몇 번 텍스트뷰를 눌렀는지 사용자에게 알려주는 예제다.

 

 

먼저 반복문을 통해 텍스트뷰 3개를 만드는 코드다.

 

public class MainActivity extends AppCompatActivity
{
LinearLayout ll;
TextView tv;
Button btn;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_main);

ll = new LinearLayout(this);
tv = new TextView(this);
btn = new Button(this);

ll.setOrientation(LinearLayout.VERTICAL);

for(int i=1; i<4;i++)
{
tv = new TextView(this);
tv.setText(i+"번째 TextView");
ll.addView(tv);
}

setContentView(ll);
}
}

이렇게 하면 반복문이 3번 돌면서(1, 2, 3) 텍스트뷰 3개가 생성될 것이다.

그 다음 코드를 더 추가해서 텍스트뷰마다 태그(이름표), 리스너를 동시에 달아보겠다.

 

public class MainActivity extends AppCompatActivity
{
LinearLayout ll;
TextView tv;
Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_main);

ll = new LinearLayout(this);
tv = new TextView(this);
btn = new Button(this);

ll.setOrientation(LinearLayout.VERTICAL);

for(int i=1; i<4;i++) {
tv = new TextView(this);
tv.setTag(i);
tv.setText(i+"번째 TextView");
tv.setOnClickListener(myListener);
ll.addView(tv);
}
setContentView(ll);
} // onCreate() end

View.OnClickListener myListener = new View.OnClickListener()
{
@Override
public void onClick(View v)
{

}
};
}

이렇게 하면 각 텍스트뷰마다 반복문에 의해 1, 2, 3이라는 태그가 생길 것이다.

마지막으로 각 태그마다 이벤트를 달아주면 끝이다.

 

View.OnClickListener myListener = new View.OnClickListener()
{
@Override
public void onClick(View v)
{

// 뷰 객체(v)들의 태그를 인티저 값으로 얻어와서 int tvKey에 담는다.

// 1~3까지의 숫자들이 tvKey에 담긴다.
int tvKey = (Integer)v.getTag();
switch (tvKey)
{
case 1 :
Toast.makeText(getApplication(),"첫번째 텍스트뷰",Toast.LENGTH_SHORT).show();
break;

case 2 :
Toast.makeText(getApplication(),"두번째 텍스트뷰",Toast.LENGTH_SHORT).show();
break;

case 3 :
Toast.makeText(getApplication(),"세번째 텍스트뷰",Toast.LENGTH_SHORT).show();
break;
}
}
};

이런 식으로 myListener라는 리스너를 달고 있는 뷰들을 대상으로 v.getTag();를 써서 태그를 뽑아낸 후에 switch문으로 case마다 이벤트를 달아주면 완성된다.

반응형
Comments