findViewById如何工作?

时间:2016-02-12 08:17:20

标签: android findviewbyid

package com.example.dell.helloworld;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void showToast(View view)
    {
        Toast t= new Toast(this);
        LayoutInflater inflater=getLayoutInflater();
        View v=inflater.inflate(R.layout.toast, (ViewGroup) findViewById(R.id.toastViewGroup));
        t.setView(v);
        t.show();


    }
}

来自android开发者网站 findViewById使用给定ID搜索子视图。

在上面的代码中,谁是父视图,其子项正在搜索给定的id?

3 个答案:

答案 0 :(得分:2)

活动中的根视图由setContentView(int layoutId)setContentView(View rootView)确定。

在你的情况下,它是

setContentView(R.layout.activity_main);

因此,您对findViewById的任何通话都会从activity_main.xml中查找ID。

如果找不到您指定的id,它将返回null。

值得一提的是,您没有调用该方法,这通常是Toast的制作方式。

Toast.makeText(getApplicationContext(), "Hello toast!", Toast.LENGTH_SHORT).show();

答案 1 :(得分:1)

对于ActivityfindViewById从活动的内容视图(使用setContentView设置)开始搜索,该活动是从布局资源中扩展的视图层次结构。 / p>

答案 2 :(得分:0)

在XML文件中,当我们添加元素并将属性设置为

时, 设置这些属性的值,现在对于每个元素,都有一个绘制它的类 在屏幕上,此类的属性与XML文件中的属性名称相同 现在使用读写文件的算法,将XML文件中的这些值传输到元素的java文件(类),然后该类在屏幕上绘制该元素。

在元素的类绘制之前,所有元素都有一个超类,所有元素的父类都称为View(活动中的每个元素都称为view),此类具有所有元素的基本属性,并且此类是将XML文件中的属性传输给它的类。

方法findViewById()返回一个View类型的对象,该对象保存属性值,然后我们需要将其强制转换为特定的元素,例如TextView是用于绘制该类和所有元素的文本视图的类。类是View类的子类,因此我们进行向下转换,以便当此方法返回View类型的对象时,我们将其向下转换为元素类

如何找到属性?如果XML文件中的标签,它将首先使用id查找元素的属性,然后首先在XML文件中搜索包含元素名称的标签,然后如果它是所需的id,则查找id 那么就会用它,否则它将搜索另一个标签(具有相同的元素名称)。

我们通过这种方法为其指定ID。有一个称为R(资源)的类,该类具有嵌套的类(id,字符串,颜色),这些类具有相同类型的属性并保存特定的值,例如,id类具有存储每个ID的属性。 XML文件中的每个元素,因此,当我们要为方法findViewById()提供ID时,我们转到该类,并告诉它输入ID类并选择所需元素的ID。

ِِ然后进入XML文件并查找具有此id的元素,然后将属性传递给类视图对象,然后返回该对象时,我们将其向下转换为元素的类,我们要画它 并处理它。