일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 객체
- rxjava cold observable
- 2022 플러터 설치
- ar vr 차이
- 안드로이드 os 구조
- rxjava hot observable
- jvm 작동 원리
- 안드로이드 유닛 테스트 예시
- 서비스 쓰레드 차이
- android retrofit login
- android ar 개발
- 안드로이드 레트로핏 사용법
- Rxjava Observable
- 멤버변수
- 스택 자바 코드
- 안드로이드 유닛 테스트
- 안드로이드 라이선스
- rxjava disposable
- 안드로이드 라이선스 종류
- 스택 큐 차이
- jvm이란
- 클래스
- 안드로이드 레트로핏 crud
- 큐 자바 코드
- 안드로이드 유닛테스트란
- ANR이란
- 서비스 vs 쓰레드
- 자바 다형성
- 2022 플러터 안드로이드 스튜디오
- 플러터 설치 2022
- Today
- Total
나만을 위한 블로그
[Android] 태그란? 본문
태그 : (어떤 표시를 하기 위해 붙인) 꼬리표, 번호표 / 옷에 붙어있는 태그와 같은 의미다.
안드로이드의 태그 : 위의 태그와 별 다를 게 없는 의미.
- 사용법
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마다 이벤트를 달아주면 완성된다.
'Android' 카테고리의 다른 글
[Android] AsyncTask란? (0) | 2019.11.28 |
---|---|
[Android] Cannot open a library at FileMapping 에러 (0) | 2019.11.26 |
[Android] 핸들러란? 루퍼란? (0) | 2019.11.25 |
[Android] 콜백이란? 리스너란? (0) | 2019.11.24 |
[Android] 뷰페이저, 카드뷰 사용 위한 implementation 코드 (0) | 2019.11.24 |