我刚在findViewById上为困惑的人写了答案,发现我的理解有差距。 这个问题只是来自知识和好奇心。
想想看:
Button=(Button ) findviewbyid ) r.id.Button;
findViewById返回View的实例,并强制将其转换为目标类。 到目前为止一切都很好。
要设置视图,findViewById根据相关XML声明中的参数生成AttributeSet,并将其传递给View构造函数。
然后,将View实例转换为Button。
AttributeSet是如何顺序传递到Button构造函数的?
编辑
所以我是个困惑的人。(: )。 重要的是,当布局膨胀时,视图层次结构中已经包含视图后代类的实例。 findViewById只需要返回对它的引用。 仔细想想就很明显了-doh .
5作为问题。为了提问,我进行了研究,找到了有关基本过程的完整信息。谢谢@Leonidos操作系统
findViewById什么都不做。 只需浏览视图层次结构并返回对具有请求的viewId的视图的引用。 View已创建并存在。 如果不对特定视图恢复findViewById,则不会进行任何更改。
视图被布局基础设施夸大了。 调用setContentView时,将分析xml布局并创建视图层次。
LayoutInflater传递给Button的构造函数的属性。 检查布局基础设施的源代码。
你知道在视图层次结构中,通过调用正确的子类ctor实例化了引用视图吗?
属性通过布局生成器传递到Buttons构造函数。 检查LayoutInflarot的源代码。
谢谢你的Leonidos操作系统。
你好,谢谢你宝贵的信息.
不要客气)
我不认为findViewById ()正在结构化或实例化View。 在展开布局的视图层次结构中查找具有匹配ID的视图。 View和View组的行为不同。
通过Android源代码:
如果此视图具有指定的id或null (View.findviewbyid ) )将返回相同的view对象,并调用:
protectedviewfindviewtraversal {
if(id==mid ) {
返回时间;
}
返回空值;
}
ViewGroup.findViewById ) )遍历子视图并在这些视图中调用相同的方法。 将调用以下方法:
protectedviewfindviewtraversal {
if(id==mid ) {
返回时间;
}
final View[] where=mChildren;
final int len=mChildrenCount;
for(intI=0; i len; I ) {
View v=where[i];
if () v.mprivateflagsis _ root _ namespace )==0) 0
v=v.findviewbyid(id;
if(v!=空) {
返回v;
}
}
}
返回空值;
}
什么是mId? 在视图类中搜索时,mId已分配给No_ID。 mId被分配给在哪里扫描的View id
@Pragnani mId是分配了视图的ID。 当您/充气机在视图中调用setid(intid )时,mId将设置为提供的int值。