Android 导航抽屉更新导致崩溃(App compact v7)

Android 导航抽屉更新导致崩溃(App compact v7),android,navigation-drawer,android-support-library,Android,Navigation Drawer,Android Support Library,我在导航抽屉中获得以下日志: 11-27 09:32:11.811: E/AndroidRuntime(2149): java.lang.NoSuchFieldError: No static field DrawerArrowToggle of type [I in class Landroid/support/v7/appcompat/R$styleable; or its superclasses (declaration of 'android.support.v7.appcompat.

我在导航抽屉中获得以下日志:

11-27 09:32:11.811: E/AndroidRuntime(2149): java.lang.NoSuchFieldError: No static field DrawerArrowToggle of type [I in class Landroid/support/v7/appcompat/R$styleable; or its superclasses (declaration of 'android.support.v7.appcompat.R$styleable' appears in /data/app/com.exa-1/base.apk)
11-27 09:32:11.811: E/AndroidRuntime(2149):     at android.support.v7.app.DrawerArrowDrawable.<init>(DrawerArrowDrawable.java:64)
11-27 09:32:11.811: E/AndroidRuntime(2149):     at android.support.v7.app.ActionBarDrawerToggle$DrawerArrowDrawableToggle.<init>(ActionBarDrawerToggle.java:469)
11-27 09:32:11.811: E/AndroidRuntime(2149):     at android.support.v7.app.ActionBarDrawerToggle.<init>(ActionBarDrawerToggle.java:222)
11-27 09:32:11.811: E/AndroidRuntime(2149):     at android.support.v7.app.ActionBarDrawerToggle.<init>(ActionBarDrawerToggle.java:150)
11-27 09:32:11.811: E/AndroidRuntime(2149):     at com.exa.MainActivity$2.<init>(MainActivity.java:199)
11-27 09:32:11.811: E/AndroidRuntime(2149):     at com.exa.MainActivity.onCreate(MainActivity.java:201)
11-27 09:32:11.811: E/AndroidRuntime(2149):     at android.app.Activity.performCreate(Activity.java:5933)
11-27 09:32:11.811: E/AndroidRuntime(2149):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
11-27 09:32:11.811: E/AndroidRuntime(2149):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251)
11-27 09:32:11.811: E/AndroidRuntime(2149):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
11-27 09:32:11.811: E/AndroidRuntime(2149):     at android.app.ActivityThread.access$800(ActivityThread.java:144)
11-27 09:32:11.811: E/AndroidRuntime(2149):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
11-27 09:32:11.811: E/AndroidRuntime(2149):     at android.os.Handler.dispatchMessage(Handler.java:102)
11-27 09:32:11.811: E/AndroidRuntime(2149):     at android.os.Looper.loop(Looper.java:135)
11-27 09:32:11.811: E/AndroidRuntime(2149):     at android.app.ActivityThread.main(ActivityThread.java:5221)
11-27 09:32:11.811: E/AndroidRuntime(2149):     at java.lang.reflect.Method.invoke(Native Method)
11-27 09:32:11.811: E/AndroidRuntime(2149):     at java.lang.reflect.Method.invoke(Method.java:372)
11-27 09:32:11.811: E/AndroidRuntime(2149):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
11-27 09:32:11.811: E/AndroidRuntime(2149):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
日志对应于我的代码中的以下行:

mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
                R.string.app_name, // 
                R.string.app_name // <~~~~ THIS LINE, Culprit identified!
) {

            public void onDrawerSlide(View drawerView, float slideOffset) {
                if(slideOffset > .55 && !drawerOpen){
                    onDrawerOpened(drawerView);
                    drawerOpen = true;
                } else if(slideOffset < .45 && drawerOpen) {
                    onDrawerClosed(drawerView);
                    drawerOpen = false;
                }
            } 





            public void onDrawerClosed(View view) {
                getActionBar().setTitle(mTitle);
                // calling onPrepareOptionsMenu() to show action bar icons
                invalidateOptionsMenu();
            }

            public void onDrawerOpened(View drawerView) {
                getActionBar().setTitle(mDrawerTitle);
                // calling onPrepareOptionsMenu() to hide action bar icons
                invalidateOptionsMenu();
            }
        };
mDrawerToggle=newactionbardrawertoggle(这是mDrawerLayout,
R.string.app_name,//
R.string.app_name/.55&&!drawerropen){
onDrawerOpened(抽屉视图);
paureropen=true;
}否则,如果(滑块偏移<.45&&D){
onDrawerClosed(抽屉视图);
paureropen=false;
}
} 
公共无效onDrawerClosed(视图){
getActionBar().setTitle(mTitle);
//调用onPrepareOptions菜单()以显示操作栏图标
无效操作菜单();
}
打开图纸上的公共空白(视图抽屉视图){
getActionBar().setTitle(mDrawerTitle);
//调用onPrepareOptions菜单()隐藏操作栏图标
无效操作菜单();
}
};
我已经添加了支持库v7,方法是将它放在我的libs文件夹中,并添加到构建路径,它在订单和导出中被勾选,但我可以在我的gen文件夹中看到android.support.v7.appcompact及其R.java


我还添加了appcompact_v7作为参考项目。我错过了什么

我认为代码没有任何问题

尝试使用项目的资源导入v7 appcompat,而不是直接将appcompat library.jar文件添加到libs文件夹中

以下是用于导入appcompat和资源的链接

将v7 appcompat项目添加为库,将其链接到主项目中,并确保根据Android 5.0编译这两个项目。
有关说明,请参阅Pallavi的链接。

有点晚了,但对我来说,问题在于将支持库作为库项目包含在我的构建路径中。除了围绕jar文件创建一个库项目外,您还需要管理支持库jar文件的多个版本/修订版这一难题,我将对此进行解释

关于您标记的行,R类是在构建时生成的,因此如果构建失败(出于任何原因),将不会有任何R类,这就是为什么您在尝试访问R类时会出现错误

如果您使用Intellij Idea(或Android Studio,因为它是Intellij的一个子集),请确保将支持库jar文件(例如Android-support-v4或Android-support-appcompat-v7)的一个且仅一个“修订版”(例如19.0或20.0或21.0)添加为“项目”库,然后添加该“库”作为使用支持库(项目结构>模块)的每个“模块”中的依赖项。添加包装器支持库项目中包含的JAR作为项目级库,不要忘记将这些“库”作为依赖项添加到主模块以及使用支持库的所有其他模块(eclipse项目)中

如果您使用的是其他一些库/依赖项,则它们很可能正在使用支持库的android-support-v4和/或android-support-appcompat-v7,这可能会导致版本冲突(以及
多索引
错误)。因此,请确保在模块级删除它们对上述jar文件的依赖,并将您的项目级库添加到这些模块中

请注意,支持库jar文件的版本与其名称中的版本编号之间存在差异。修订版指的是Android平台的API级别(Android版本),您已经下载了该级别的支持库(使用SDK管理器),并且(针对该版本)jar已经更新,以提供该特定API级别的新功能。jar名称中包含的版本是特定jar所需的“最低”SDK

选择与您正在使用的所有库兼容的修订版。较新版本的支持库不一定向后兼容,一些内容可能已在较新版本中删除

如果您来自Eclipse,用Intellij Idea的术语来说,“模块”是一个库项目(一个除了代码之外还包含资源(如图形)的项目,就像支持库或图表绘制库一样)。除了库项目外,常规Eclipse项目也被视为“模块”,而“项目”被视为一组(相关)模块(一个主模块,其余作为库模块)


如果您已经在另一个IDE中构建了您的项目,请确保“重建”您的项目(在Intellij Idea中)或“清理”(在Eclpise中)在运行应用程序之前。不幸的是,Eclipse和Intellij Idea/Android Studio不兼容,一方创建的编译文件无法被另一方读取。

对我来说,问题是一个较旧的google play services库-我更新了它,并且都工作正常:)谢谢你,伙计!
mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
                R.string.app_name, // 
                R.string.app_name // <~~~~ THIS LINE, Culprit identified!
) {

            public void onDrawerSlide(View drawerView, float slideOffset) {
                if(slideOffset > .55 && !drawerOpen){
                    onDrawerOpened(drawerView);
                    drawerOpen = true;
                } else if(slideOffset < .45 && drawerOpen) {
                    onDrawerClosed(drawerView);
                    drawerOpen = false;
                }
            } 





            public void onDrawerClosed(View view) {
                getActionBar().setTitle(mTitle);
                // calling onPrepareOptionsMenu() to show action bar icons
                invalidateOptionsMenu();
            }

            public void onDrawerOpened(View drawerView) {
                getActionBar().setTitle(mDrawerTitle);
                // calling onPrepareOptionsMenu() to hide action bar icons
                invalidateOptionsMenu();
            }
        };