2013-02-10 4 views
8

findViewById가 혼란스러워하는 사람의 답변을 작성한 후 이해가 부족하다는 것을 깨달았습니다. 이 질문은 지식과 호기심만을위한 것입니다.findViewById가 뷰를 초기화하는 방법은 무엇입니까?

이것을 고려 :

button = (Button)findViewById(R.id.button); 

findViewById는 대상 클래스에 캐스팅 View의 인스턴스를 반환합니다. 지금까지 좋은 모든 것.

보기를 설정하기 위해 findViewById은 의 생성자에 전달되는 연관된 XML 선언의 매개 변수에서 AttributeSet을 생성합니다.

그러면 View 인스턴스를 Button으로 전송합니다.

AttributeSetButton 생성자로 차례로 전달 되나요?

[편집]

그래서 저는 혼란 스러웠습니다. :) 요점은 레이아웃이 팽창 할 때 뷰 계층 구조에 뷰 하위 클래스의 인스턴스가 이미 포함되어 있다는 것입니다. findViewById는 단순히 참조를 반환합니다. 당신이 그것에 대해 생각할 때 명백한 ...

+0

+5 퀘스트 온을위한 ... 질문 때문에 나는 basi에 관한 완전한 정보를 조사하고 찾았습니다. C 흐름 .... 덕분에 @ 레오 도스 – Pragnani

답변

10

findViewById는 아무 것도하지 않습니다. 뷰 계층 구조를보고 요청 된 viewId이있는 뷰에 대한 참조를 반환합니다. View은 이미 생성되어 존재합니다. 일부보기에서 findViewById으로 전화하지 않으면 아무 것도 변경되지 않습니다.

조회수는 LayoutInflator에 의해 비정상적으로 증가합니다. setContentView을 호출하면 xml 레이아웃이 구문 분석되고 뷰 계층 구조가 만들어집니다.

버튼의 생성자에 전달 된 속성은 LayoutInflater입니다. LayoutInflator source code을 확인하십시오.

+0

아, 알겠습니다. 당신은 뷰 계층에서, 참조 된 뷰가 이미 올바른 자손 클래스의 ctor를 호출함으로써 인스턴스화되었다는 것을 의미합니까? – Simon

+0

속성은 Button의 생성자에 layout inflater에 의해 전달됩니다. [LayoutInflarot 소스 코드] (http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.2_r1.1/android/view/LayoutInflater.java#LayoutInflater)를 확인하십시오. inflate % 28org.xmlpull.v1.XmlPullParser % 2Candroid.view.ViewGroup % 2Cboolean % 29). – Leonidos

+0

Leonidos 고맙습니다. – Simon

5

findViewById() 생각하지 않습니다.보기를 구성하거나 인스턴스를 만듭니다. ID가 일치하는보기에 대해 이미 팽창 된 레이아웃의보기 계층 구조에서 검색합니다.이 방법은 ViewViewGroup에 대해 다르게 작동합니다.

안드로이드 소스 코드에서

: 아이 뷰를 통해

protected View findViewTraversal(int id) { 
    if (id == mID) { 
     return this; 
    } 
    return null; 
} 

ViewGroup.findViewById() 반복하고 다음에 같은 방법으로 호출이보기는 지정된 ID는 null가있는 경우

View.findViewById()이 같은보기 개체를 반환, 그것은 호출 조회수 : 전화 :

protected View findViewTraversal(int id) { 
    if (id == mID) { 
     return this; 
    } 

    final View[] where = mChildren; 
    final int len = mChildrenCount; 

    for (int i = 0; i < len; i++) { 
     View v = where[i]; 

     if ((v.mPrivateFlags & IS_ROOT_NAMESPACE) == 0) { 
      v = v.findViewById(id); 

      if (v != null) { 
       return v; 
      } 
     } 
    } 

    return null; 
} 
+0

보기 클래스를 검색 할 때 mId가 No_ID ...에 할당되었습니다. 어디로 이동 했나요?보기 ID – Pragnani

+0

@Pragnani'mId'는 보기의 할당 된 ID you/inflater가 뷰에서'setId (int id)'를 호출하면,'mID'는 제공된 int 값으로 설정됩니다. –

관련 문제