Android Eclipse java.lang.NoClassDefFoundError:android.support.v4.content.ContextCompat解决方法
在使用ContextCompat.getDrawable()方法时报错java.lang.NoClassDefFoundError:android.support.v4.content.ContextCompat,如下图所示,通过查询博客终于知道原因,解决办法因人而异,先交待背景。
背景:
开发Arcgis for Android程序,由于Esri公司停止对Eclipse提供支撑,可参考 Eclipse 4.6 neon搭建Arcgis for Android的开发环境,以后会渐渐转移到Android Studio上,使用Arcgis for Android 10.2.4版本,创建新的Arcgis for Android工程。
要实现地图平移后定位按钮改变selector的功能,需在setOnPanListener()中添加监听事件。
获取selector调用getResources().getDrawable()方法,而该方法早已过时弃用。
1、getDrawable()替换方法
参考博文:(1)AS问题解决系列2—Resources中getDrawable(int)过时
亲测: 第一篇博文中的方法均做了测试,不能使用;第二种方法中的ContextCompat.getDrawable()方法可用。
2、ContextCompat
按照博文使用该方法,结果Eclipse报错。
原因:该类属于android.support.v4.content,而使用Arcgis for Android创建的工程中并没有该jar包,接下来到导入jar包。
3、导入android.support.v4 jar包
我在导入在包的时候出现了错误,参考了一篇正确导入android-support-v4.jar的方法,导入jar包的方法是对的,但用在这里就不合适了。(错误需要写出来,帮助理解NoClassDefFoundError)
上图是我按照上篇博文导入android-support-v4.jar文件后的结果,后面是jar文件的路径。
编译后出现第一张图片中的错误,网上继续找原因,找到了两篇博文。
(3) Android studio java.lang.NoClassDefFoundError: android.support.v4.app add multidex
(4)怎么解决java.lang.NoClassDefFoundError错误
第三篇博文中指出是多个版本的问题,而第四篇博文解释了出现该错误的原因:
NoClassDefFoundError错误发生的原因
NoClassDefFoundError错误的发生,是因为Java虚拟机在编译时能找到合适的类,而在运行时不能找到合适的类导致的错误。例如在运行时我们想调用某个类的方法或者访问这个类的静态成员的时候,发现这个类不可用,此时Java虚拟机就会抛出NoClassDefFoundError错误。与ClassNotFoundException的不同在于,这个错误发生只在运行时需要加载对应的类不成功,而不是编译时发生。
简单总结就是,NoClassDefFoundError发生在编译时对应的类可用,而运行时在Java的classpath路径中,对应的类不可用导致的错误。
通过该段话看上图,编译的时候引用了Referenced Libraries中的anroid-support-v4.jar包,但是在运行的时候并未将该路径下的jar打包到生成的apk文件中去,运行时就产生了java.lang.NoClassDefFoundError.
4、解决办法
(1)将上述构建到path的jar包删除
在Referenced Libraries的jar右击,选择【Build Path】——【Remove from Build Path】
(2)将jar包拷入libs文件夹下
没有libs文件夹的新建一个;右击jar包,选择【Build Path】
运行成功。