实施支持库操作栏时出错

我正在尝试实施新的v7支持库ActionBar 。 但是,我无法让它正常运行。

这是例外

 07-25 09:30:01.704: E/AndroidRuntime(9175): FATAL EXCEPTION: main 07-25 09:30:01.704: E/AndroidRuntime(9175): java.lang.NoClassDefFoundError: android.support.v7.appcompat.R$styleable 07-25 09:30:01.704: E/AndroidRuntime(9175): at android.support.v7.app.ActionBarActivityDelegate.onCreate(ActionBarActivityDelegate.java:98) 07-25 09:30:01.704: E/AndroidRuntime(9175): at android.support.v7.app.ActionBarActivityDelegateICS.onCreate(ActionBarActivityDelegateICS.java:58) 07-25 09:30:01.704: E/AndroidRuntime(9175): at android.support.v7.app.ActionBarActivity.onCreate(ActionBarActivity.java:98) 07-25 09:30:01.704: E/AndroidRuntime(9175): at com.cidaut.termoweb.MainActivity.onCreate(MainActivity.java:23) 07-25 09:30:01.704: E/AndroidRuntime(9175): at android.app.Activity.performCreate(Activity.java:5133) 07-25 09:30:01.704: E/AndroidRuntime(9175): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 07-25 09:30:01.704: E/AndroidRuntime(9175): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175) 07-25 09:30:01.704: E/AndroidRuntime(9175): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261) 07-25 09:30:01.704: E/AndroidRuntime(9175): at android.app.ActivityThread.access$600(ActivityThread.java:141) 07-25 09:30:01.704: E/AndroidRuntime(9175): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256) 07-25 09:30:01.704: E/AndroidRuntime(9175): at android.os.Handler.dispatchMessage(Handler.java:99) 07-25 09:30:01.704: E/AndroidRuntime(9175): at android.os.Looper.loop(Looper.java:137) 07-25 09:30:01.704: E/AndroidRuntime(9175): at android.app.ActivityThread.main(ActivityThread.java:5103) 07-25 09:30:01.704: E/AndroidRuntime(9175): at java.lang.reflect.Method.invokeNative(Native Method) 07-25 09:30:01.704: E/AndroidRuntime(9175): at java.lang.reflect.Method.invoke(Method.java:525) 07-25 09:30:01.704: E/AndroidRuntime(9175): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 07-25 09:30:01.704: E/AndroidRuntime(9175): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 07-25 09:30:01.704: E/AndroidRuntime(9175): at dalvik.system.NativeStart.main(Native Method) 

问题发生在onCreate()super.onCreate(bundle)调用。

这是我所有与主题相关的XML:

styled.xml

 <?xml version="1.0" encoding="utf-8"?> <resources> <style name="Theme.Termoweb" parent="@style/Theme.AppCompat.Light.DarkActionBar"> <item name="actionBarItemBackground">@drawable/selectable_background_termoweb</item> <item name="popupMenuStyle">@style/PopupMenu.Termoweb</item> <item name="dropDownListViewStyle">@style/DropDownListView.Termoweb</item> <item name="actionBarTabStyle">@style/ActionBarTabStyle.Termoweb</item> <item name="actionDropDownStyle">@style/DropDownNav.Termoweb</item> <item name="actionBarStyle">@style/ActionBar.Solid.Termoweb</item> <item name="actionModeBackground">@drawable/cab_background_top_termoweb</item> <item name="actionModeSplitBackground">@drawable/cab_background_bottom_termoweb</item> <item name="actionModeCloseButtonStyle">@style/ActionButton.CloseMode.Termoweb</item> <!-- Light.DarkActionBar specific --> <item name="actionBarWidgetTheme">@style/Theme.Termoweb.Widget</item> </style> <style name="ActionBar.Solid.Termoweb" parent="@style/Widget.AppCompat.Light.ActionBar.Solid.Inverse"> <item name="background">@drawable/ab_solid_termoweb</item> <item name="backgroundStacked">@drawable/ab_stacked_solid_termoweb</item> <item name="backgroundSplit">@drawable/ab_bottom_solid_termoweb</item> <item name="progressBarStyle">@style/ProgressBar.Termoweb</item> </style> <style name="ActionBar.Transparent.Termoweb" parent="@style/Widget.AppCompat.ActionBar"> <item name="background">@drawable/ab_transparent_termoweb</item> <item name="progressBarStyle">@style/ProgressBar.Termoweb</item> </style> <style name="PopupMenu.Termoweb" parent="@style/Widget.AppCompat.ListView.Menu"> <item name="popupBackground">@drawable/menu_dropdown_panel_termoweb</item> </style> <style name="DropDownListView.Termoweb" parent="@style/Widget.AppCompat.ListView.DropDown"> <item name="listSelector">@drawable/selectable_background_termoweb</item> </style> <style name="ActionBarTabStyle.Termoweb" parent="@style/Widget.AppCompat.ActionBar.TabView"> <item name="background">@drawable/tab_indicator_ab_termoweb</item> </style> <style name="DropDownNav.Termoweb" parent="@style/Widget.AppCompat.Spinner"> <item name="background">@drawable/spinner_background_ab_termoweb</item> <item name="popupBackground">@drawable/menu_dropdown_panel_termoweb</item> <item name="dropDownSelector">@drawable/selectable_background_termoweb</item> </style> <style name="ProgressBar.Termoweb" parent="@style/Widget.AppCompat.ProgressBar.Horizontal"> <item name="progressDrawable">@drawable/progress_horizontal_termoweb</item> </style> <style name="ActionButton.CloseMode.Termoweb" parent="@style/Widget.AppCompat.ActionButton.CloseMode"> <item name="background">@drawable/btn_cab_done_termoweb</item> </style> <!-- this style is only referenced in a Light.DarkActionBar based theme --> <style name="Theme.Termoweb.Widget" parent="@style/Theme.AppCompat"> <item name="popupMenuStyle">@style/PopupMenu.Termoweb</item> <item name="dropDownListViewStyle">@style/DropDownListView.Termoweb</item> </style> </resources> 

AndroidManifest.xml中

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.cidaut.termoweb" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/Theme.Termoweb" > <activity android:name="com.cidaut.termoweb.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> 

那么,我是如何解决这个问题的:

  1. 从“sdk / extras / android / support / v7 / appcompat”导入支持库作为项目。
  2. 您的项目中的引用库(对于Eclipse,“属性 – Android – 添加”)。
  3. 构build项目(对于Eclipse,“项目 – 构build全部”)。 确保你的主项目gen文件夹中有“android.support.v7.appcompat”。
  4. 如果它不工作 – 清理和重build项目。

我做了以下工作,为我工作。

  • 从libs文件夹中删除jar。
  • 在eclipse工作区导入sdk \ extras \ android \ support \ v7 \ appcompat \ project。
  • 确保你的项目中的android-support-v4.jar是一样的。
  • 将appcompat作为库添加到您的项目中。

确保您在Manifest.xml中的活动具有正确的主题

  <activity android:name="***.*****.******" android:label="@string/app_name" android:theme="@style/Theme.AppCompat.Light" > 

祝你好运 ;)

除了BoredT的回答,我把这一行添加到res / values / styles.xml

 <style name="AppTheme" parent="@style/Theme.AppCompat.Light"> 

按照添加资源库的步骤 – > Eclipse http://developer.android.com/tools/support-library/setup.html

  1. 遵循所有步骤(在工作区中使用复制项目)
  2. android.library.reference.1=../android-support-v7-appcompat到您的project.properties中
  3. 使用android:theme="@style/Theme.AppCompat"我在应用程序标记中使用它,你也可以应用到单独的活动中

重build所有!

我认为你应该在清单中将目标版本更改为18。

 android:targetSdkVersion="18" 

这是我解决问题的方法:在eclipse工作区重buildadroid-support-v7-appcompat库项目。 然后再build立你自己的项目。

如何在android studio中将项目导入为库? 按照提示博客作为参考: http : //showlabor.blogspot.com.br/2013/05/actionbarsherlock-in-android-studio-01.html

下一个问题也有很大帮助: 实现支持库操作栏时出错

下图显示了导入项目的结构。 这是复制到我的项目的根目录放在目录“库”: https : //dl.dropboxusercontent.com/u/67269258/Tuto/tree.PNG

除了安装上述结构。 在'settings.glade'中,我不得不添加新的项目:

 include ':FreeMusic', ':libraries:ActionBarCompat:appcompat' 

在库项目里面,添加了文件'build.gradle'它位于:libraries / ActionBarCompat / appcompat

  buildscript { repositories { mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:0.5.+' } } apply plugin: 'android-library' dependencies { compile files( 'libs/android-support-v4.jar', 'libs/android-support-v7-appcompat.jar' ) } android { compileSdkVersion 18 buildToolsVersion "18.0.1" defaultConfig { minSdkVersion 7 targetSdkVersion 16 } sourceSets { main { manifest.srcFile 'AndroidManifest.xml' java.srcDirs = ['src'] resources.srcDirs = ['src'] aidl.srcDirs = ['src'] renderscript.srcDirs = ['src'] res.srcDirs = ['res'] assets.srcDirs = ['assets'] } instrumentTest.setRoot('tests') } } 

在我的项目的“build.gradle”(内部项目)中。

 dependencies { compile project(':libraries:ActionBarCompat:appcompat') } 

在Android清单中添加了必要的主题:

 <activity android:theme="@style/Theme.AppCompat" android:name="es.hol.soundmedia.MainActivity" 

毕竟这工作。 也许更简单的方法来设置,但对我来说,帐户正在工作。 不幸的是我不能显示结果,因为我被阻止,但我希望说明帮助。

对于那些不喜欢在Eclipse中为了从checkout进行构build而需要手动用户的努力,Eclipse所做的神奇变化就是添加一行到project.properties中,如下所示:

 android.library.reference.1=../android-support-v7-appcompat 

这足以构build你的应用程序。 您可以自己或通过Eclipse用户界面在源代码中执行此操作 – 无论是哪种方式,都可以将其签入到版本控制系统中,并且无需手动步骤即可从全新的源代码签出成功构build。

但是,如果更适合,可以将path作为自己的项目的子目录,例如

 android.library.reference.1=android-support-v7-appcompat 

…和…

 cp -r $SDK/extras/android/support/v7/appcompat android-support-v7-appcompat 

请注意,Eclipse仍将显示各种警告,直到子目录也作为项目添加到Eclipse的工作区。 但是一个ant构build将会成功构build而不使用Eclipse。

检查R.java是否有appcompat v7 jar文件存在于您的应用程序生成的文件夹中