如果两个xml布局文件,main.xml 和 two.xml :如下
main.xml
|
two.xml
|
我们可以看到,两个不同的xml布局文件,都定义了相同的TextView ,同时id 的名称为 tvxxxxx 。这个时候项目是如何根据id找到正确的组件呢?比如如果一个是TextView,一个是ImageVIew组件,两个完全的不同的组件,如果找错了怎么办?
可能有同学会说:在R文件中,每个组件的id名称,会加上对应布局的前缀,比如:
R.java
int id main_tvxxxxx
int id two_tvxxxxx
事实会是这样吗?那我们就直接看下R文件把
|
看到文件后,我们发现tvxxxx在R文件中只有一个,并不是存在前缀的问题。
结果:
当我们进入Activity的第一步就是通过 setContentView(R.layout.activity_main); 设置布局,这个setContenView的工作原理简单说就是告诉桌面 window,你把我加到最前面的视图上。这个时候,我们通过findViewbyid()查找组件的时候,会在main这个布局上查找id为 0x7f080190 组件。如果成功找到就会返回main这个布局上的对应组件。
思考:
当我们把main.xml文件下的组件都删除了,main会通过findViewbyid发现 0x7f080190 这个组件吗?
答案是否定的。
当我们把main.xml文件下的组件都删除完了,通过 this.tv = (TextView) findViewById(R.id.tvxxxxx); 查找组件的时候,我们发现编译器并不会报错,这是为什么呢?明明main.xml文件里已经没有tvxxxx这个组件了。这是因为findviewById() 传参 R.id.tvxxxx。这个tvxxxx在R.java文件下依然存在,所以编译并不会报错,但是在 setContentView的时候,我们把最顶端布局已经设置好了,从最顶端布局main.xml文件中,并没有找到这个组件。所以即使组件查找没有问题,但是返回的却是null。
结论:
我们在定义组件的时候,id的虽然可以相同,但是编译器并不能查找对应的xml文件是否已经删除了组件,这样如果你直接使用已经删除的组件,就会无法找到组件,报空指针异常。