R.java的不能识别控件的问题
今天在调试一个网上的小例子的时候,遇到的一个问题:发现自己以前调用R.java文件的R.id.btn...获取到的组件突然都不能用了,下面显示的都是红色的错误标志,很奇怪。如下:
因为这些组件也是当时调用R.java.可以生成的,为什么现在不能用了,发现项目中gen目录下那些自动生成的文件R.java等不见了,文件夹也为空,于是通过重新清理项目,重新构建等也没能让它产生。最终还是通过下面的办法解决的,如图:
然而这只是解决了没有R.java之类的自动生成的文件的问题,却没有解决生成的那些错误。于是突然冒出来一个想法:会不会是与R有关的包没有导入进去或者导入错误。查看上面导入的包发现,有个与R有关包:import android.R;第一反应就是那应该能用啊,有包啊。试着删除下看看会报出来什么错误,结果就是令我惊呆了。。。。。竟然错误全部消失了!!!对,是全部!!!错误,消失了???!!!重新添上,仔细看下发现上面有个警告:
仔细看上面的解释可以看到,它要我们:不要在此处包含android.R文件;每次使用时用完全限定名代替。
android.R 是Android的资源文件索引,它中间很多是系统自定义的一些默认的东西。我试着去导入android.R.id内部类:
import android.R.id;直接调用id里的静态变量,在输入“id.”后的提示结果如下:
可见这些是系统的一些默认的常量。而不是我们自己定义的常量(我们在xml布局文件中 通过@+id/...这种方式添加的)。其实我们自己定义的这些常量存在的位置就是Android为我们自动生成的那些文件中,此处为:R.java。
然后我特意去看看以前建的项目,发现里面根本就没有import android.R这句。那时候也确实没有遇到这种错误。这就证明了我们导入android.R包之后,通过R.id调用的不再是我们自己添加的控件的id常量,而是添加的系统自定义的那些常量(这也是为什么当我们没有给拖拽进去的控件定义id属性时系统能自动为我们添加上类似 android:id="@+id/button1的原因,而且其会地洞增长,如:button2,button3 ,......)而显然此时我们调用我们自己的控件的时候不会再给我们自动提示,而我们强制手动输入上之后就会报错,因为R静态类以及其下面的id静态类与我们自己定义的重名了,无法识别,造成我们无法访问自己的控件。
因此解决方法就是去掉那句有时候系统为我们自动导入的android.R 包:import android.R;