我刚刚为一个被findViewById所迷惑的人写了一个答案,我意识到我的理解存在差距。这个问题仅是出于知识和好奇心。

考虑一下:

button = (Button)findViewById(R.id.button);
findViewById返回View的实例,然后将其强制转换为目标类。到目前为止一切都很好。

要设置 View ,findViewById根据关联的XML声明中的参数构造一个AttributeSet,并将其传递给View的构造函数。

然后,我们将View实例转换为Button
AttributeSet如何依次传递给Button构造函数?

[编辑]

所以我是一个困惑的人:)。重点是,当布局膨胀时, View 层次结构已包含 View 后代类的实例。 findViewById只是返回对其的引用。当您考虑时很明显-Doh ..

最佳答案

findViewById不执行任何操作。它只是浏览 View 层次结构,并返回对带有请求viewId的 View 的引用。 View已经创建并存在。如果您不为某些 View 调用findViewById,则没有任何变化。

View 由LayoutInflator夸大。当您调用setContentView时,将解析xml布局并创建 View 层次结构。

通过LayoutInflater传递给Button的构造函数的属性。检查LayoutInflator source code

关于android - findViewById如何初始化 View ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14801008/

10-12 02:41