实现支持库操作栏出错

26

我正在尝试实现新的v7 Support Library 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>
9个回答

53

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

  1. 从 "sdk/extras/android/support/v7/appcompat" 导入支持库作为项目。
  2. 在您的项目中引用该库(对于Eclipse,“属性 - Android - 添加”)。
  3. 构建项目(对于Eclipse,“项目 - 构建全部”),确保您的主项目 gen 文件夹中有“android.support.v7.appcompat”。
  4. 如果不起作用,请清理并重新构建项目。

3
你确定你的 gen 文件夹中有 "android.support.v7.appcompat.R.java" 这个文件吗?如果没有它,程序将无法正常运行。 - BoredT
1
我非常确定在v7 gen文件夹中有R.java。 - Charlie-Blake
我曾引用了@style/Widget.AppCompat.Spinner,但出于某种原因它并不存在。我只是删除了所有对该样式的引用,一切都像魔法般地正常工作了。 - Charlie-Blake
"构建全部" ...我怎么会错过它,但我确实错过了。谢谢。 - McGafter
是的,在 gen 文件夹中必须有 android.support.v7.appcompat 包。 - peacepassion
我已经添加了库并且它显示在“引用文件夹”中,但是在Android选项卡中找不到它。 - Si8

14

我已经完成以下步骤,并且对我起作用:

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

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

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

祝你好运 ;)


4
+1 是因为提到该活动必须使用“Theme.AppCompat”主题或一个子类“Theme.AppCompat”的主题。 - S-K'

4
除了BoredT的回答,我还在res/values/styles.xml中添加了这一行。
<style name="AppTheme" parent="@style/Theme.AppCompat.Light">

2
请按照以下步骤进行操作:从“添加带资源的库”开始 -> 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",我在应用标签中使用了它,您也可以将其应用于单个活动

重新构建所有内容!


这解决了我的问题。将该行添加到project.properties中,使Eclipse能够生成R.java文件。 - Leon

1
如何在Android Studio中将项目导入为库?请参考以下提示博客: http://showlabor.blogspot.com.br/2013/05/actionbarsherlock-in-android-studio-01.html 接下来的问题也有很大帮助: Error implementing Support Library Action Bar 下面的图片显示了导入项目的结构。将其复制到我的项目根目录并放置在“libraries”目录中: 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"

经过所有的工作,也许有一种更简单的设置方法,但对我来说,这个账户正在运作。 不幸的是,我无法展示结果,因为我被阻止了,但我希望这些说明可以帮助到你。


1
我认为你应该在清单文件中将目标版本更改为18。
android:targetSdkVersion="18"

1

对于那些不喜欢在Eclipse中需要手动操作才能从检出中进行构建的人,Eclipse所做的神奇变化是在project.properties文件中添加一行代码,例如:

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

这已经足够从Ant构建您的应用程序。您可以在源代码中自己完成此操作,也可以通过Eclipse用户界面完成 - 无论哪种方式,您都可以将其检入到版本控制系统中,并成功地从源代码的新检出构建而不需要手动步骤。
但是,如果更适合您,您可以将路径设置为自己项目的子目录,例如:
android.library.reference.1=android-support-v7-appcompat

... and ...

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

请注意,直到将子目录[手动!]添加到Eclipse的工作区作为项目后,Eclipse仍会显示各种警告。但是,使用Ant构建将成功构建而无需使用Eclipse。

1
这是我解决问题的方法:在你的Eclipse工作区中重新构建adroid-support-v7-appcompat库项目。然后再次构建你自己的项目。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接