Android异常:分析NoClassDefFoundError: Failed resolution of: Landroid/support/v7/appcompat/R$styleable异常

来源:互联网 发布:淘宝售后换货申请 编辑:程序博客网 时间:2024/05/14 02:29

本篇记录一下使用android-support-v7-appcompat.jar包时,遇到的各种异常问题。
异常包括:
java.lang.NoClassDefFoundError: android.support.v7.app.AppCompatDelegateImplV14;
NoClassDefFoundError: Failed resolution of: Landroid/support/v7/appcompat/R$styleable;
IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity。
转载请注明出处:http://blog.csdn.net/adayabetter/article
欢迎交流讨论。

分析过程

    -

1.最初遇到的异常

  • java.lang.NoClassDefFoundError: android.support.v7.app.AppCompatDelegateImplV14

因为自定义Activity继承了android.support.v7.app.AppCompatActivity,在OnCreate方法中调用
super.onCreate(savedInstanceState)出现了该异常。经过查找资料分析,是android-support-v7-appcompat.jar包版本问题导致。开始各种搜索support-v7 jar包。更换jar包后,又出现了新的异常。

public class NiceDialogActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_nicedialog);    }

2.更换jar包后遇到的异常

异常信息如下:NoClassDefFoundError: Failed resolution of: Landroid/support/v7/appcompat/R$styleable

E/AndroidRuntime(26374): java.lang.NoClassDefFoundError: Failed resolution of: Landroid/support/v7/appcompat/R$styleable;09-07 09:23:18.084: E/AndroidRuntime(26374):    at android.support.v7.app.AppCompatDelegateImplV7.createSubDecor(AppCompatDelegateImplV7.java:336)09-07 09:23:18.084: E/AndroidRuntime(26374):    at android.support.v7.app.AppCompatDelegateImplV7.ensureSubDecor(AppCompatDelegateImplV7.java:309)09-07 09:23:18.084: E/AndroidRuntime(26374):    at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:273)09-07 09:23:18.084: E/AndroidRuntime(26374):    at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:139)09-07 09:23:18.084: E/AndroidRuntime(26374):    at com.example.niceDialog.NiceDialogActivity.onCreate(NiceDialogActivity.java:18)

分析该异常的内容:
如下图是AppCompatDelegateImplV7中createSubDecor()的代码
createSubDecor方法截取
从异常内容可以看出,该处未识别android.support.v7.appcompat.R.styleable
作为单独的Jar包,android-support-v7-appcompat.jar内并无R文件。由此想到了,需要把android-support-v7-appcompat.jar包作为Library引入到项目中


解决方法:
1. 把android-support-v7-appcompat工程导入Eclipse,选择项目->右键Properties->Android->Is Library打上对勾。
2. 在自己的工程中,点击右键,选择Properties,选Android,在Library中点击“Add”,添加android-support-v7-appcompat作为Library。
如下图
添加Library

此时项目的gen目录就出现了android.support.v7.appcompat.R.styleable。
如下图:
添加后的效果

再次运行,NoClassDefFoundError: Failed resolution of: Landroid/support/v7/appcompat/R$styleable异常以及不出现了。
但是有了新的异常,继续往下看。

3. 添加Library库后遇到的异常

解决了前面提到的2个异常后,本以为一切都恢复了正常,终于可以喘口气了,可是看到的还是闪退。
继续分析异常日志:IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.

09-07 10:05:53.504 E/AndroidRuntime(18996): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.test/com.example.niceDialog.NiceDialogActivity}: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.09-07 10:05:53.504 E/AndroidRuntime(18996):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325)09-07 10:05:53.504 E/AndroidRuntime(18996):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)09-07 10:05:53.504 E/AndroidRuntime(18996):     at android.app.ActivityThread.access$800(ActivityThread.java:151)09-07 10:05:53.504 E/AndroidRuntime(18996):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)

原因:
从错误提示中提到Theme.AppCompat theme,这是因为我们的activity继承了兼容包中的类(还记得最上面那段代码吗?继承了AppCompatActivity),
它来自android.support.v7.app.AppCompatActivity。
所以就要使用与其配合的AppCompat的theme才行。
解决:
1.根据提示来使用AppCompat的theme,如下:

<activity android:name="com.example.niceDialog.NiceDialogActivity"            android:theme="@style/Theme.AppCompat.NoActionBar">            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>

经过以上种种,终于可以正常运行了,哈哈 ^_^
转载注明出处:http://blog.csdn.net/adayabetter/article/details/77879657

阅读全文
1 1
原创粉丝点击