2012-11-27 1 views
3

Depuis la nouvelle mise à jour d'Android 4.1 vers 4.2 sur mon smartphone, mon application émet une exception, lorsqu'il initialise un ViewPager et ses Activités.Android 4.2: IllegalstateException: Un ou plusieurs enfants de ce LayerDrawable n'ont pas d'état constant

L'exception:

java.lang.IllegalStateException: un ou plusieurs enfants de ce LayerDrawable n'a pas constante; cet drawable ne peut pas être muté.

Le StackTrace:

java.lang.RuntimeException: Unable to start activity ComponentInfo{imatuve.info/imatuve.news.NewsTabActivity}: android.view.InflateException: Binary XML file line #3: Error inflating class <unknown> 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 
    at android.app.ActivityThread.access$600(ActivityThread.java:141) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:137) 
    at android.app.ActivityThread.main(ActivityThread.java:5039) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:511) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
    at dalvik.system.NativeStart.main(Native Method)Caused by: android.view.InflateException: Binary XML file line #3: Error inflating class <unknown> 
    at android.view.LayoutInflater.createView(LayoutInflater.java:613) 
    at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56) 
    at android.view.LayoutInflater.onCreateView(LayoutInflater.java:660) 
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:685) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:466) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:396) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:352) 
    at imatuve.news.NewsTabActivity.createTabView(NewsTabActivity.java:313) 
    at imatuve.news.NewsTabActivity.initialiseTabHost(NewsTabActivity.java:261) 
    at imatuve.news.NewsTabActivity.onCreate(NewsTabActivity.java:96) 
    at android.app.Activity.performCreate(Activity.java:5104) 
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144) 
    ... 11 more 
    Caused by: java.lang.reflect.InvocationTargetException 
    at java.lang.reflect.Constructor.constructNative(Native Method) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:417) 
    at android.view.LayoutInflater.createView(LayoutInflater.java:587) 
... 23 more 
    Caused by: android.content.res.Resources$NotFoundException: File res/drawable/tab_bg_selector.xml from drawable resource ID #0x7f020065 
    at android.content.res.Resources.loadDrawable(Resources.java:1953) 
    at android.content.res.TypedArray.getDrawable(TypedArray.java:601) 
    at android.view.View.<init>(View.java:3328) 
    at android.view.View.<init>(View.java:3257) 
    at android.view.ViewGroup.<init>(ViewGroup.java:425) 
    at android.widget.RelativeLayout.<init>(RelativeLayout.java:210) 
    ... 26 more 
    Caused by: java.lang.IllegalStateException: One or more children of this LayerDrawable does not have constant state; this drawable cannot be mutated. 
    at android.graphics.drawable.LayerDrawable.mutate(LayerDrawable.java:579) 
    at android.graphics.drawable.DrawableContainer.selectDrawable(DrawableContainer.java:315) 
    at android.graphics.drawable.StateListDrawable.onStateChange(StateListDrawable.java:106) 
    at android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:189) 
    at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:885) 
    at android.graphics.drawable.Drawable.createFromXml(Drawable.java:822) 
    at android.content.res.Resources.loadDrawable(Resources.java:1950) 
    ... 31 more 

Le code:

private static View createTabView(final Context context, final String tag) { 

      //The exception comes when inflating the view 
      View view = LayoutInflater.from(context).inflate(R.layout.tabs_bg, null); 

    TextView tv = (TextView)view.findViewById(R.id.tabsText); 
    tv.setText(tag); 

    return view; 
} 

tab_bg_selector.xml:

<?xml version="1.0" encoding="utf-8"?> 

<!-- Active tab --> 
<item android:state_selected="true" android:state_focused="false" 
    android:state_pressed="false" android:drawable="@drawable/tab_bg_selected" /> 
<!-- Inactive tab --> 
<item android:state_selected="false" android:state_focused="false" 
    android:state_pressed="false" android:drawable="@drawable/tab_bg_unselected" /> 
<!-- Pressed tab --> 
<item android:state_pressed="true" android:drawable="@drawable/tab_bg_pressed" /> 
<!-- Selected tab --> 
<item android:state_focused="true" android:state_selected="true" 
    android:state_pressed="false" android:drawable="@color/transparent" /> 

tab_pg_pressed.xml

<?xml version="1.0" encoding="utf-8"?> 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" > 
<item 
    android:bottom="8dp" 
    android:top="63dp"> 
    <shape android:shape="rectangle" > 
     <solid android:color="#70c0e7fd" /> 
    </shape> 
</item> 

<!-- mask out the bottom line of the tab shape --> 
<item 
    android:left="15dp" 
    android:right="15dp" 
    android:top="63dp"> 
    <shape android:shape="rectangle" > 
     <corners android:bottomLeftRadius="0dp" 
      android:bottomRightRadius="0dp" 
      android:topLeftRadius="3dp" 
      android:topRightRadius="3dp" /> 

     <solid android:color="#70c0e7fd" /> 
    </shape> 
</item> 

tab_bg_selected.xml

<?xml version="1.0" encoding="utf-8"?> 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" > 
<item 
    android:bottom="8dp" 
    android:top="63dp"> 
    <shape android:shape="rectangle" > 
     <solid android:color="#ffc0e7fd" /> 
    </shape> 
</item> 

<!-- mask out the bottom line of the tab shape --> 
<item 
    android:left="15dp" 
    android:right="15dp" 
    android:top="63dp"> 
    <shape android:shape="rectangle" > 
     <corners android:bottomLeftRadius="0dp" 
      android:bottomRightRadius="0dp" 
      android:topLeftRadius="3dp" 
      android:topRightRadius="3dp" /> 

     <solid android:color="#ffc0e7fd" /> 
    </shape> 
</item> 

tab_bg_unselected.xml

<?xml version="1.0" encoding="utf-8"?> 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" > 
</layer-list> 

La mise en page de "tabs_bg" existe dans mon dossier de mise en page, tout comme la res/drawable/tab_bg_selector.xml.

Sur un système d'exploitation Android 4.1 ou inférieur, cette exception ne se produit pas. Qu'est-ce que cela peut être et comment puis-je m'en débarrasser?

+0

Pouvez-vous partager 'tab_bg_selector.xml'? – fiddler

+0

Je vois la même chose sur 4.2 pour un calque dessinable en code ... J'ai encore besoin d'enquêter sur ce qui se passe. – botteaap

Répondre

3

J'ai trouvé le problème. Il se trouve dans le tab_bg_unselected.xml. Il est évident que dans Android 4.2, la liste des couches doit avoir au moins un enfant. J'ai donc ajouté un élément à la liste et l'application ne rejette plus l'exception!

Mais ajouter un élément 'vide' ne suffit pas! Il doit aussi être un contenu, comme une forme ou plus.

Questions connexes