我刚刚为对 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/