web-dev-qa-db-fra.com

Crash: mise en page Java.lang.NoClassDefFoundError: Android.support.v7.appcompat.R $

Certains utilisateurs de mon application rencontrent ce problème, ce qui pourrait être lié aux appareils Samsung. Quelqu'un at-il rencontré ce problème et trouvé une solution?

Java.lang.NoClassDefFoundError: Android.support.v7.appcompat.R$layout
       at Android.support.v7.app.ActionBarActivityDelegateBase.ensureSubDecor(ActionBarActivityDelegateBase.Java:297)
       at Android.support.v7.app.ActionBarActivityDelegateBase.setContentView(ActionBarActivityDelegateBase.Java:225)
       at Android.support.v7.app.ActionBarActivity.setContentView(ActionBarActivity.Java:102)
       at com.afollestad.impression.ui.MainActivity.onCreate(MainActivity.Java:160)
       at Android.app.Activity.performCreate(Activity.Java:5451)
       at Android.app.Instrumentation.callActivityOnCreate(Instrumentation.Java:1093)
       at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2359)
       at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:2453)
       at Android.app.ActivityThread.access$900(ActivityThread.Java:173)
       at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1303)
       at Android.os.Handler.dispatchMessage(Handler.Java:102)
       at Android.os.Looper.loop(Looper.Java:136)
       at Android.app.ActivityThread.main(ActivityThread.Java:5579)
       at Java.lang.reflect.Method.invokeNative(Method.Java)
       at Java.lang.reflect.Method.invoke(Method.Java:515)
       at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:1268)
       at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:1084)
       at dalvik.system.NativeStart.main(NativeStart.Java)

La ligne 160 définit la vue du contenu de l'activité. La vue du contenu est la suivante:

<Android.support.v4.widget.DrawerLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    Android:id="@+id/drawer_layout"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    tools:context="com.afollestad.lessen.ui.MainActivity"
    Android:fitsSystemWindows="true">

    <LinearLayout
        Android:orientation="vertical"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent">

        <Android.support.v7.widget.Toolbar
            Android:id="@+id/toolbar"
            Android:layout_height="wrap_content"
            Android:layout_width="match_parent"
            Android:minHeight="?attr/actionBarSize"
            Android:background="?colorPrimary"
            app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
            app:popupTheme="?popup_theme" />

        <FrameLayout
            Android:id="@+id/content_frame"
            Android:layout_width="match_parent"
            Android:layout_height="match_parent" />

    </LinearLayout>

    <FrameLayout
        Android:layout_width="@dimen/navigation_drawer_width"
        Android:layout_height="match_parent"
        Android:fitsSystemWindows="true"
        Android:layout_gravity="start">

        <fragment
            Android:id="@+id/navigation_drawer"
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"
            Android:name="com.afollestad.impression.fragments.NavDrawerFragment"
            tools:layout="@layout/fragment_navdrawer"
            Android:tag="NAV_DRAWER" />

    </FrameLayout>

</Android.support.v4.widget.DrawerLayout>

Le fragment est un simple fragment de liste.

14
afollestad

J'ai résolu le problème en utilisant Proguard avec la configuration suivante:

-keep class !Android.support.v7.internal.view.menu.**,** {*;}
-dontwarn
-ignorewarnings
-dontshrink

Pour activer Proguard avec les versions les plus récentes de Gradle (dans Android Studio):

Android {

    ...

    buildTypes {
        debug {
            ...
        }
        release {
            ...
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
        }
    }
}

proguard-rules.pro est l'endroit où vont les propriétés en haut.

8
afollestad

Je sais que le problème a été résolu, mais si vous arrivez sur ce fil, il se peut que cela ne résolve pas votre problème dans une combinaison particulière:

  • Tout fonctionne sur les appareils 5.0
  • Cela ne marche pas sur 4.x
  • Vous pensez que vous activez MultiDex
  • Proguard ne semble pas être un problème

Cela m'est arrivé et j'ai cherché pendant 3 heures. Pour activer MultiDex sur des périphériques 4.x, il ne suffit pas de modifier la construction: vous devez sous-classer la classe Application. Il suffit de suivre que et que

J'espère que ça aide.

24
Laurent Meyer

Si vous utilisez multidex dans votre application, étendez votre classe Application à partir de MultiDexApplication.

3
Gurgen Hakobyan

si vous utilisez api compat support-v7, toutes les bibliothèques dont la référence doit être marquée doivent être exclues du module: 'support-v4'

par exemple:

compiler ('com.Android.support:cardview-v7:22.2.0') { module d'exclusion: 'support-v4' }

1
Anton Rifco Susilo