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

Posted by ITPangPang
2016. 10. 20. 00:38 안드로이드(android)/View


setTag, getTag

사용하기(1)

findViewWithTag




ㆍ 이번글을 시작으로 Tag에 대해 한 3~4번정도 글을

    쓰면서 알아보려고 합니다


ㆍ setTag, getTag를 잘 사용하면 View를 정말 효율적으로

    제어할 수 있습니다.


ㆍ 특히, 뭔가 새로운것을 만들때.. 막막할때.. 꼼수로 사용하기

    딱이죠..


ㆍ 첫번째 글은 기본적으로 setTag, getTag 사용방법과

    "findViewWithTag"라는 놈을 사용해보도록 하겠습니다.

    



    먼저 Tag란?

    

Tag

그냥 읽었을때

대부분 생각하는

그 뜻입니다.


바코드라 생각할수도 있고

꼬리표? 아니면 이름표

같은 역할이죠


옷가게에서 옷에 붙어있는

Tag도 마찬가지고


웹에서 사용하는

Tag도 마찬가지죠


안드로이드에서도

이름표, 꼬리표 같은

느낌이라 생각하시면

됩니다.


어떻게 사용하나?


사용방법은

간단합니다.


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

이렇게 적어주시면

고유의 이름표가

View에 박히게 됩니다.


그럼 예제를

만들어보자면

음...


작성해볼 예제는

Tag는 아무래도

동적으로 View를 생성할때

많이 사용하므로


동적으로 TextView와

버튼을 생성해서

예를 들어보겠습니다.


LinearLayout 1개

TextView 3개

Button 1개


를 먼저 생성하겠습니다.

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.addView(tv);
ll.addView(tv2);
ll.addView(tv3);
ll.addView(btn);
setContentView(ll);
}
}


요렇게 대충

만들어 보고


화면에 보이게 하기 위해서

TextView, Button마다

 간단한 Text를 써봅니다


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");
btn.setText("이것은 버튼");

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


이렇게 만들면


이런 화면이 나옵니다.


이제 본격적으로

setTag를 달아봅니다


TextView가 3개이므로

얘네들한테 달아보면


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

이렇게 달아주면

됩니다.


그럼 어떻게 활용하나?


setTag로

다는것 까진

동일하지만


이것을 얼마나 

잘 활용하느냐에

따라서 효율성은

천차만별입니다


위 코드에서

Button에 클릭리스너를

달아서 TextView를

지워보도록 하겠습니다.


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);
}
});

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


ll.findViewWithTag("tv1").setVisibility(View.GONE);

이 부분만 보면 되겠죠


다른 부분은 다 익숙한데

아마 ll.findViewWithTag

 처음보시는분도 있을텐데


위 코드에서

TextView는 LinearLayout의

ChildView이죠


그래서 부모의 View에서

자식을 Tag를 통해서 찾아주는

부분입니다.


tv1이라는 이름표를 가진

View를 찾아서

setVisibility(View.GONE);

지워버려라



실행시켜서 버튼을 눌러보면

"tv1"이라는 태그를 가진

첫번째 TextView가 사라진 것을

확인 할 수 있습니다.



자 그럼

TextView 3개를

다 지워보려면?

btn.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
ll.findViewWithTag("tv1").setVisibility(View.GONE);
ll.findViewWithTag("tv2").setVisibility(View.GONE);
ll.findViewWithTag("tv3").setVisibility(View.GONE);
}
});


일단 이렇게 하면

원하는데로 TextView를

전부 지워버릴 수 있겠죠?


근데 굉장히 비효율적인것

같습니다.


Tag를 괜히

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);
i++;
}


}
});


돌려 보면

위와 똑같이

3개의 TextView가

사라지는 것을 확인 할 수 있습니다


좀 더 활용하면

원하는 View에만 특정 Tag를

달아서 원하는 View만

제어해 줄 수도 있겠죠


역시 동적생성은 반복문!


이번예제는



위와 같이

TextView 3개를

반복문을 통하여

동적생성하고


각 TextView마다

setTag를 달고

Tag를 활용해서 클릭이벤트를

받아보도록 하겠습니다



먼저

반복문을 통하여

TextView 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번 돌아가면서

TextView 3개가 생성되겠죠?



그 다음 코드를

몇줄 더 추가해서

TextView마다 이름표(Tag)를

달아주고


리스너도 동시에 달아보도록

하겠습니다.

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);
}

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

}
};
}


이렇게 해주면

각 TextView마다

1, 2, 3이라는 Tag가

생기겠죠


그럼 이제

마지막으로 각 태그마다

이벤트를 달아주면 됩니다


View.OnClickListener myListener = new View.OnClickListener()
{
@Override
public void onClick(View v)
{
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라는 리스너를

달고 있는 View들을

대상으로


v.getTag();

태그를 뽑아낸후에


switch문으로

case 마다 이벤트를

달아주면 완성됩니다!!


이것으로

setTag, getTag, findViewWithTag

기본에 대해 알아봤습니다.


다음글부터는

Tag를 사용해서

좀 더 활용도가 높거나

꼼수로 사용하기 좋은 예제를

만들어서 사용해보도록 하겠습니다 


끝!