2013-02-10 38 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