Android findViewById如何初始化视图
我刚刚为一个被findViewById弄糊涂的人写了一个答案,我意识到我的理解有一个差距。这个问题只针对知识和好奇心 考虑这一点:Android findViewById如何初始化视图,android,Android,我刚刚为一个被findViewById弄糊涂的人写了一个答案,我意识到我的理解有一个差距。这个问题只针对知识和好奇心 考虑这一点: button = (Button)findViewById(R.id.button); findViewById返回View的实例,然后将其强制转换到目标类。到目前为止一切都很好 要设置视图,findViewById从关联XML声明中的参数构造一个AttributeSet,并将其传递给视图的构造函数 然后,我们将视图实例转换为按钮 AttributeSet如何依次
button = (Button)findViewById(R.id.button);
findViewById
返回View
的实例,然后将其强制转换到目标类。到目前为止一切都很好
要设置视图,findViewById
从关联XML声明中的参数构造一个AttributeSet
,并将其传递给视图的构造函数
然后,我们将视图
实例转换为按钮
AttributeSet
如何依次传递给按钮
构造函数
[编辑]
所以我是那个困惑的人:)。关键是,当布局膨胀时,视图层次结构已经包含视图子类的实例。findViewById只返回对它的引用。想想看,这是显而易见的——doh..findViewById
什么都不做。它只是查看视图层次结构并返回对具有请求的viewId
的视图的引用<代码>视图
已创建并存在。如果不为某些视图调用findviewbyd
,则不会发生任何更改
视图通过LayoutInflator
膨胀。调用setContentView
xml时,将解析布局并创建视图层次结构
通过
LayoutInflater
传递给按钮构造函数的属性。检查。我不认为findViewById()
构造或实例化视图。它将在已膨胀布局的视图层次结构中搜索具有匹配id的视图。此方法对视图
和视图组
的效果不同
来自Android源代码:
View.findViewById()
返回相同的视图对象如果此视图具有给定的id或null,它将调用:
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;
}
ViewGroup.findViewById()
迭代子视图并对这些视图调用相同的方法,它调用:
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;
}
protectedview findViewTraversal(int-id){
如果(id==mID){
归还这个;
}
最终视图[],其中=mChildren;
最终整数=mChildrenCount;
对于(int i=0;i
啊,我明白了。您的意思是,在视图继承者权限中,通过调用布局膨胀器传递给Button构造函数的正确子类属性的ctor,引用的视图已经被实例化。检查。什么是mId,当我在视图中搜索时,类mId被分配给No_ID。它在哪里将mId分配给遍历的视图id@PragnanimId
是视图的指定ID。当您/充气机在视图上调用setId(int ID)
时,mID
设置为提供的int值。对于queston,+5……由于您的问题,我已经研究并找到了有关基本流程的完整信息……感谢@Leonidos