«   2024/12   »
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 31
Tags
more
Archives
Today
Total
관리 메뉴

올해는 머신러닝이다.

모든 뷰에 이벤트 등록하기 본문

Android/Tip&Tech

모든 뷰에 이벤트 등록하기

행복한 수지아빠 2011. 6. 29. 09:33
제작하는 한 어플리케이션에 버튼은 총 몇개나 등장할까요?

버튼의 이벤트를 등록하려면 또 똑같은 코딩을 몇번을 해야 할 지 모릅니다.

그래서 준비한 강쉪의 특별 소스.

'모든 뷰를 등록하자'입니다.

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에서 사용하는데 보다 많은 도움이 되는 소스라 생각됩니다. ^^

그럼 이만 다음에 뵙겠습니다