제작하는 한 어플리케이션에 버튼은 총 몇개나 등장할까요?
버튼의 이벤트를 등록하려면 또 똑같은 코딩을 몇번을 해야 할 지 모릅니다.
그래서 준비한 강쉪의 특별 소스.
'모든 뷰를 등록하자'입니다.
Android SDK는 java코딩만으로도 충분히 xml의 역할을 대신 할 수 있지만,
바로 눈으로 보이는 구조와 편리함, 연동성을 생각한다면 불가피하게 xml을 사용 할 수 밖에 없습니다.
Android SDK가 1.0부터 발전을 거듭해와 현재 나온 2.2 버전까지
달라진 메소드는 없지만 사라지거나 새로 생긴것들이 많습니다.
이번 주제와도 비슷한 예를 들자면
xml의 버튼에
<Button
android:onClick = "ClickHandler" //java에 연동되는 id가 아닌 onClick에 아이디를 줍니다.
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
라고 사용하신다면
java에선
public void ClickHandler(View target){
Intent i = new Intent();
switch(target.getId()){
case R.id.$#^%^#%^%:
break;
}
}
이런식으로 손쉽게 구현이 가능해 집니다
이는 Android SDK 2.1 이상의 버젼에서만 사용되는 메소드로 그 이전의 SDK를 사용하면 구현되지 않습니다.
이제 이벤트를 처리하는 메소드를 알아봤으니
본격적으로 리스너를 등록해 보도록 하겠습니다.
한 프로젝트에 버튼이 50개 정도 등장한다고 생각해 봅시다.
그중 각 Activity마다 10개씩의 버튼을 사용 해야 한다면??
생각만 해도 어지럽습니다.
그래서 등장한것이
메인 Layout에 ID넣기!
일단은 다른생각 말고 따라해 보세요 ^^
예를들어 자신의 프로젝트에 Main으로 쓰이는 xml이
RelativeLayout이라면?
그 최상위 Layout에
android:id="@+id/mainview_layout"
이라고 등록을 해줍니다.
그리고 자바로 넘어가
onCreate 안에
RelativeLayout layout = (RelativeLayout)findViewById(R.id.mainview_layout);
setOnclickListener(layout); //최상위 레이아웃 리스너 등록
이렇게 등록을 해주시는 겁니다.
이게 끝이 아니죠
private void setOnclickListener(ViewGroup group){ //모든 뷰 그룹 등록
View[] childViews = getChildViews(group);
for (View view : childViews){
if(view instanceof Button){
view.setOnClickListener(this);
}else if(view instanceof ViewGroup){
setOnclickListener((ViewGroup)view); //재귀돌림
}
}
}
이렇게 모든 뷰를 등록 해줍니다.
이게 무슨 뜻일까요??
for문을 이용해 View에 생겨나는 자식 View들을 모두 등록해 줍니다.
하지만!
xml의 구조상 한 Layout안에 다른 Layout을 생성할 필요가 있겠죠.
그 때에는 재귀를 돌려 한번더 등록해주는 것입니다.
private View[] getChildViews(ViewGroup group){
int childCount = group.getChildCount();
final View[] childViews = new View[childCount];
for (int index =0;index < childCount; index++){
childViews[index] = group.getChildAt(index);
}
return childViews;
}
그 후 자식View에 java에서 쓰일 아이디값을 채워 넣어주면 ok!
xml에서 각 버튼의 아이디 값을 주어
그것이 R.id에 등록이 되고
또 그것을 java에서 사용하는데 보다 많은 도움이 되는 소스라 생각됩니다. ^^
그럼 이만 다음에 뵙겠습니다
버튼의 이벤트를 등록하려면 또 똑같은 코딩을 몇번을 해야 할 지 모릅니다.
그래서 준비한 강쉪의 특별 소스.
'모든 뷰를 등록하자'입니다.
Android SDK는 java코딩만으로도 충분히 xml의 역할을 대신 할 수 있지만,
바로 눈으로 보이는 구조와 편리함, 연동성을 생각한다면 불가피하게 xml을 사용 할 수 밖에 없습니다.
Android SDK가 1.0부터 발전을 거듭해와 현재 나온 2.2 버전까지
달라진 메소드는 없지만 사라지거나 새로 생긴것들이 많습니다.
이번 주제와도 비슷한 예를 들자면
xml의 버튼에
<Button
android:onClick = "ClickHandler" //java에 연동되는 id가 아닌 onClick에 아이디를 줍니다.
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
라고 사용하신다면
java에선
public void ClickHandler(View target){
Intent i = new Intent();
switch(target.getId()){
case R.id.$#^%^#%^%:
break;
}
}
이런식으로 손쉽게 구현이 가능해 집니다
이는 Android SDK 2.1 이상의 버젼에서만 사용되는 메소드로 그 이전의 SDK를 사용하면 구현되지 않습니다.
이제 이벤트를 처리하는 메소드를 알아봤으니
본격적으로 리스너를 등록해 보도록 하겠습니다.
한 프로젝트에 버튼이 50개 정도 등장한다고 생각해 봅시다.
그중 각 Activity마다 10개씩의 버튼을 사용 해야 한다면??
생각만 해도 어지럽습니다.
그래서 등장한것이
메인 Layout에 ID넣기!
일단은 다른생각 말고 따라해 보세요 ^^
예를들어 자신의 프로젝트에 Main으로 쓰이는 xml이
RelativeLayout이라면?
그 최상위 Layout에
android:id="@+id/mainview_layout"
이라고 등록을 해줍니다.
그리고 자바로 넘어가
onCreate 안에
RelativeLayout layout = (RelativeLayout)findViewById(R.id.mainview_layout);
setOnclickListener(layout); //최상위 레이아웃 리스너 등록
이렇게 등록을 해주시는 겁니다.
이게 끝이 아니죠
private void setOnclickListener(ViewGroup group){ //모든 뷰 그룹 등록
View[] childViews = getChildViews(group);
for (View view : childViews){
if(view instanceof Button){
view.setOnClickListener(this);
}else if(view instanceof ViewGroup){
setOnclickListener((ViewGroup)view); //재귀돌림
}
}
}
이렇게 모든 뷰를 등록 해줍니다.
이게 무슨 뜻일까요??
for문을 이용해 View에 생겨나는 자식 View들을 모두 등록해 줍니다.
하지만!
xml의 구조상 한 Layout안에 다른 Layout을 생성할 필요가 있겠죠.
그 때에는 재귀를 돌려 한번더 등록해주는 것입니다.
private View[] getChildViews(ViewGroup group){
int childCount = group.getChildCount();
final View[] childViews = new View[childCount];
for (int index =0;index < childCount; index++){
childViews[index] = group.getChildAt(index);
}
return childViews;
}
그 후 자식View에 java에서 쓰일 아이디값을 채워 넣어주면 ok!
xml에서 각 버튼의 아이디 값을 주어
그것이 R.id에 등록이 되고
또 그것을 java에서 사용하는데 보다 많은 도움이 되는 소스라 생각됩니다. ^^
그럼 이만 다음에 뵙겠습니다
'Android > Tip&Tech' 카테고리의 다른 글
[펌]Android listview into HEADER (0) | 2011.06.30 |
---|---|
해상도 960 * 540 avd 만들기(예:아트릭스) (0) | 2011.06.29 |
안드로이드 및 아이폰 해상도 비교 (0) | 2011.06.29 |
안드로이드 팝업윈도우 만들기 (1) | 2011.06.28 |
android editext textarea처럼 만들기 (0) | 2011.06.28 |