2013-02-10 104 views
8

我剛剛爲findviewById困惑的人寫了一個答案,我意識到我在理解上存在差距。這個問題只是爲了知識和好奇心。findViewById如何初始化視圖

考慮一下:

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

findViewById返回View一個實例,然後將其轉換爲目標類。迄今爲止都很好。

要設置視圖,findViewById將從關聯的XML聲明中的參數構造一個AttributeSet,並將其傳遞給構造函數View

然後,我們將View實例投射到Button

AttributeSet如何依次通過構造函數Button

[編輯]

所以我很困惑的一個:)。整個觀點是,當佈局膨脹時,視圖層次結構已經包含視圖後代類的一個實例。 findViewById只是返回一個對它的引用。顯然,當你想到它 - doh ..

+0

+5爲queston ....因爲你的問題我已經研究並找到關於basi的完整信息c流....感謝@Leonidos – Pragnani 2013-02-10 19:07:39

回答

10

findViewById什麼都不做。它只是查看視圖層次結構,並返回對請求的視圖的引用viewIdView已經創建並存在。如果你不打電話findViewById一些看法沒有任何改變。

觀看次數由LayoutInflator誇大。當你調用setContentView xml佈局被解析並且創建了視圖層次結構。

通過LayoutInflater傳遞給Button的構造函數的屬性。檢查LayoutInflator source code

+0

啊,我明白了。你的意思是在視圖heirarchy中,引用的視圖已經通過調用正確的後代類的ctor來實例化? – Simon 2013-02-10 18:30:36

+0

屬性由layout inflater傳遞給Button的構造函數。檢查[LayoutInflarot源代碼](http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.2_r1.1/android/view/LayoutInflater.java#LayoutInflater。充氣%28org.xmlpull.v1.XmlPullParser%2Candroid.view.ViewGroup%2Cboolean%29)。 – Leonidos 2013-02-10 18:35:41

+0

謝謝Leonidos。 – Simon 2013-02-10 18:55:56

5

我不認爲findViewById()構造或實例化視圖。它將在View層次結構中搜索已經膨脹的佈局,以查看具有匹配id的視圖。對於ViewViewGroup,此方法的工作方式不同。

從Android源代碼:

View.findViewById()返回相同的視圖對象,如果這種觀點具有給定id或無效,則調用:通過孩子的意見

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

迭代,並呼籲這些同樣的方法視圖,它調用:

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,當我在視圖類中搜索時,mId被分配給No_ID ..在哪裏它將mId分配給遍歷的視圖ID – Pragnani 2013-02-10 18:58:36

+0

@Pragnani'mId'是視圖的分配ID。當你/ inflater在視圖上調用'setId(int id)'時,'mID'被設置爲提供int值。 – 2013-02-10 19:01:52