实施支持库操作栏时出错

时间:2013-07-25 07:34:17

标签: android android-actionbar android-support-library

我正在尝试实施新的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)

问题发生在super.onCreate(bundle)的{​​{1}}来电。

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

styled.xml

onCreate()

的AndroidManifest.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>

9 个答案:

答案 0 :(得分:53)

所以,我是如何解决这个问题的:

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

答案 1 :(得分:14)

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

  • 从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"
         >

祝你好运;)

答案 2 :(得分:4)

除了BoredT的回答,我还将此行添加到res / values / styles.xml

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

答案 3 :(得分:2)

按照使用资源添加库中的步骤 - &gt; 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"我在应用标签中使用它,您也可以应用于个人活动
  4. 全部重建!

答案 4 :(得分:1)

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

android:targetSdkVersion="18"

答案 5 :(得分:1)

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

答案 6 :(得分: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 manifest中添加了必要的主题:

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

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

答案 7 :(得分:1)

对于那些不喜欢在Eclipse中需要手动用户工作以便从checkout进行构建的人来说,Eclipse所做的神奇变化是向project.properties添加一行,如:

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

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

但是,如果更适合,您可以将路径设置为您自己项目的子目录,例如

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

......和......

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

请注意,在将子目录[hand!]作为项目添加到Eclipse的工作区之前,Eclipse仍将显示各种警告。但是,无需使用Eclipse即可成功构建ant构建。

答案 8 :(得分:0)

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