setTag, getTag 사용하기(1) - findViewWithTag
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를 사용해서
좀 더 활용도가 높거나
꼼수로 사용하기 좋은 예제를
만들어서 사용해보도록 하겠습니다
끝!
'안드로이드(android) > View' 카테고리의 다른 글
setTag, getTag 사용하기(2) - ImageView (0) | 2016.10.22 |
---|---|
TextView 내부 크기 구하기 - Rect, getPaint() (1) | 2016.10.17 |
View를 최상위로 올리기 - BringToFront (0) | 2016.10.15 |
TextView가 물흐르듯 움직인다? marquee를 써보자 (0) | 2016.06.14 |
다른 Activity(액티비티), Fragment에 있는 View값 가져오기 (1) | 2016.04.28 |