Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/215.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android findViewById如何初始化视图_Android - Fatal编程技术网

Android findViewById如何初始化视图

Android findViewById如何初始化视图,android,Android,我刚刚为一个被findViewById弄糊涂的人写了一个答案,我意识到我的理解有一个差距。这个问题只针对知识和好奇心 考虑这一点: button = (Button)findViewById(R.id.button); findViewById返回View的实例,然后将其强制转换到目标类。到目前为止一切都很好 要设置视图,findViewById从关联XML声明中的参数构造一个AttributeSet,并将其传递给视图的构造函数 然后,我们将视图实例转换为按钮 AttributeSet如何依次

我刚刚为一个被findViewById弄糊涂的人写了一个答案,我意识到我的理解有一个差距。这个问题只针对知识和好奇心

考虑这一点:

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@Pragnani
mId
是视图的指定ID。当您/充气机在视图上调用
setId(int ID)
时,
mID
设置为提供的int值。对于queston,+5……由于您的问题,我已经研究并找到了有关基本流程的完整信息……感谢@Leonidos