android - findViewById 如何初始化 View

标签 android

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

相关文章:

android - adb.exe 在 Windows 7 上挂起

android - MyGestureDetector 扩展了 SimpleOnGestureListener

android - 应用强行关闭;无法实例化 Activity

android - NDK 和 Android Studio,由于共享库而导致编译崩溃

android - 如何在 Android Studio 中使用 Smack 与 Openfire XMPP 服务器联网

android - 使用apktool反编译apk文件

java - 如何根据用户输入动态加载滚动 Activity 的标题?

java - `file://` uri 前缀是我可以硬编码的吗?

android - 自定义项目 ListView ,在 TextView 的最后一个字符之后带有 ImageView

android - 如何将 PayPal sdk 与 Gradle Android 集成