2013-09-03 11 views
11

Si verifica il seguente arresto anomalo sul Samsung Galaxy Ace/Y/Pocket/Mini. Funziona bene su tutti gli altri dispositivi. Arresti anomali si verificano solo su Android 2.3.5 o 2.3.6Samsung Galaxy/Holoeverywhere - Risorsa non è un ColorStateList (colore o percorso)

Non c'è alcun riferimento al mio codice nello stacktrace. Sembra provenire dal layout del menu che non ho personalizzato.

Sospetto che sia un errore nel sistema operativo Galaxy. Ma non posso confermare.

Ancora più importante, cosa posso evitare o attenuare questo errore?

android.view.InflateException: Binary XML file line #45: Error inflating class 
at org.holoeverywhere.LayoutInflater._createView(SourceFile:382) 
at org.holoeverywhere.LayoutInflater.onCreateView(SourceFile:594) 
at org.holoeverywhere.LayoutInflater.createViewFromTag(SourceFile:444) 
at org.holoeverywhere.LayoutInflater.rInflate(SourceFile:731) 
at org.holoeverywhere.LayoutInflater.rInflate(SourceFile:734) 
at org.holoeverywhere.LayoutInflater.inflate(SourceFile:538) 
at org.holoeverywhere.LayoutInflater.inflate(SourceFile:488) 
at com.android.internal.view.menu.MenuItemImpl.createItemView(MenuItemImpl.java:592) 
at com.android.internal.view.menu.MenuItemImpl.getItemView(MenuItemImpl.java:577) 
at com.android.internal.view.menu.MenuBuilder$MenuAdapter.getView(MenuBuilder.java:1173) 
at android.widget.AbsListView.obtainView(AbsListView.java:1592) 
at android.widget.ListView.measureHeightOfChildren(ListView.java:1251) 
at android.widget.ListView.onMeasure(ListView.java:1162) 
at android.view.View.measure(View.java:8313) 
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138) 
at android.widget.FrameLayout.onMeasure(FrameLayout.java:250) 
at android.view.View.measure(View.java:8313) 
at android.view.ViewRoot.performTraversals(ViewRoot.java:845) 
at android.view.ViewRoot.handleMessage(ViewRoot.java:1865) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:130) 
at android.app.ActivityThread.main(ActivityThread.java:3687) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:507) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625) 
at dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.reflect.InvocationTargetException 
at java.lang.reflect.Constructor.constructNative(Native Method) 
at java.lang.reflect.Constructor.newInstance(Constructor.java:415) 
at org.holoeverywhere.LayoutInflater._createView(SourceFile:358) 
... 26 more Caused by: android.content.res.Resources$NotFoundException: Resource is not a ColorStateList (color or path): TypedValue{t=0x1/d=0x7f0d014c a=3 r=0x7f0d014c} 
at android.content.res.Resources.loadColorStateList(Resources.java:1804) 
at android.content.res.TypedArray.getColorStateList(TypedArray.java:342) 
at android.widget.TextView.(TextView.java:445) 
at org.holoeverywhere.widget.TextView.(SourceFile:133) 
at org.holoeverywhere.widget.TextView.(SourceFile:129) 
... 29 more java.lang.reflect.InvocationTargetException 
at java.lang.reflect.Constructor.constructNative(Native Method) 
at java.lang.reflect.Constructor.newInstance(Constructor.java:415) 
at org.holoeverywhere.LayoutInflater._createView(SourceFile:358) 
at org.holoeverywhere.LayoutInflater.onCreateView(SourceFile:594) 
at org.holoeverywhere.LayoutInflater.createViewFromTag(SourceFile:444) 
at org.holoeverywhere.LayoutInflater.rInflate(SourceFile:731) 
at org.holoeverywhere.LayoutInflater.rInflate(SourceFile:734) 
at org.holoeverywhere.LayoutInflater.inflate(SourceFile:538) 
at org.holoeverywhere.LayoutInflater.inflate(SourceFile:488) 
at com.android.internal.view.menu.MenuItemImpl.createItemView(MenuItemImpl.java:592) 
at com.android.internal.view.menu.MenuItemImpl.getItemView(MenuItemImpl.java:577) 
at com.android.internal.view.menu.MenuBuilder$MenuAdapter.getView(MenuBuilder.java:1173) 
at android.widget.AbsListView.obtainView(AbsListView.java:1592) 
at android.widget.ListView.measureHeightOfChildren(ListView.java:1251) 
at android.widget.ListView.onMeasure(ListView.java:1162) 
at android.view.View.measure(View.java:8313) 
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138) 
at android.widget.FrameLayout.onMeasure(FrameLayout.java:250) 
at android.view.View.measure(View.java:8313) 
at android.view.ViewRoot.performTraversals(ViewRoot.java:845) 
at android.view.ViewRoot.handleMessage(ViewRoot.java:1865) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:130) 
at android.app.ActivityThread.main(ActivityThread.java:3687) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:507) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625) 
at dalvik.system.NativeStart.main(Native Method) Caused by: android.content.res.Resources$NotFoundException: Resource is not a ColorStateList (color or path): TypedValue{t=0x1/d=0x7f0d014c a=3 r=0x7f0d014c} 
at android.content.res.Resources.loadColorStateList(Resources.java:1804) 
at android.content.res.TypedArray.getColorStateList(TypedArray.java:342) 
at android.widget.TextView.(TextView.java:445) 
at org.holoeverywhere.widget.TextView.(SourceFile:133) 
at org.holoeverywhere.widget.TextView.(SourceFile:129) 
... 29 more android.content.res.Resources$NotFoundException: Resource is not a ColorStateList (color or path): TypedValue{t=0x1/d=0x7f0d014c a=3 r=0x7f0d014c} 
at android.content.res.Resources.loadColorStateList(Resources.java:1804) 
at android.content.res.TypedArray.getColorStateList(TypedArray.java:342) 
at android.widget.TextView.(TextView.java:445) 
at org.holoeverywhere.widget.TextView.(SourceFile:133) 
at org.holoeverywhere.widget.TextView.(SourceFile:129) 
at java.lang.reflect.Constructor.constructNative(Native Method) 
at java.lang.reflect.Constructor.newInstance(Constructor.java:415) 
at org.holoeverywhere.LayoutInflater._createView(SourceFile:358) 
at org.holoeverywhere.LayoutInflater.onCreateView(SourceFile:594) 
at org.holoeverywhere.LayoutInflater.createViewFromTag(SourceFile:444) 
at org.holoeverywhere.LayoutInflater.rInflate(SourceFile:731) 
at org.holoeverywhere.LayoutInflater.rInflate(SourceFile:734) 
at org.holoeverywhere.LayoutInflater.inflate(SourceFile:538) 
at org.holoeverywhere.LayoutInflater.inflate(SourceFile:488) 
at com.android.internal.view.menu.MenuItemImpl.createItemView(MenuItemImpl.java:592) 
at com.android.internal.view.menu.MenuItemImpl.getItemView(MenuItemImpl.java:577) 
at com.android.internal.view.menu.MenuBuilder$MenuAdapter.getView(MenuBuilder.java:1173) 
at android.widget.AbsListView.obtainView(AbsListView.java:1592) 
at android.widget.ListView.measureHeightOfChildren(ListView.java:1251) 
at android.widget.ListView.onMeasure(ListView.java:1162) 
at android.view.View.measure(View.java:8313) 
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138) 
at android.widget.FrameLayout.onMeasure(FrameLayout.java:250) 
at android.view.View.measure(View.java:8313) 
at android.view.ViewRoot.performTraversals(ViewRoot.java:845) 
at android.view.ViewRoot.handleMessage(ViewRoot.java:1865) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:130) 
at android.app.ActivityThread.main(ActivityThread.java:3687) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:507) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625) 
at dalvik.system.NativeStart.main(Native Method) 

Ecco l'intero theme.xml

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

    <style name="CustomWindowTitleText" parent="TextAppearance.Sherlock.Widget.ActionBar.Title"> 
     <item name="android:textColor">@color/primary_text_yellow</item> 
     <item name="android:textStyle">bold|italic</item> 
    </style> 

    <style name="CustomWindowTitleText.ActionBar"> 
     <item name="android:textSize">@dimen/textsize_mid</item> 
    </style> 

    <style name="CustomWindowSubTitleText" parent="TextAppearance.Sherlock.Widget.ActionBar.Subtitle"> 
    </style> 


    <!-- Changes the background color of the title bar --> 
    <style name="CustomWindowTitleBackground"> 
     <item name="android:background">@drawable/background_window_title</item> 
    </style> 

    <!-- Set the theme for the window title --> 
    <!-- NOTE: setting android:textAppearance to style defined above --> 
    <style name="CustomWindowTitle"> 
     <item name="android:singleLine">true</item> 
     <item name="android:shadowColor">#BB000000</item> 
     <item name="android:shadowRadius">2.75</item> 
     <item name="android:textAppearance">@style/CustomWindowTitleText</item> 
     <item name="android:paddingLeft">40dp</item> 
    </style> 

    <!-- 
     http://actionbarsherlock.com/theming.html 
     Due to limitations in Android's theming system any theme customizations must be declared in two attributes. 
     The normal android-prefixed attributes apply the theme to the native action bar and the unprefixed attributes are for the custom implementation. 
    --> 
    <style name="CustomActionBar" parent="Widget.Sherlock.Light.ActionBar.Solid.Inverse"> <!--parent="@android:style/Widget.Holo.ActionBar"--> 
     <item name="android:background">@drawable/gradient_lightpurple_darkpurple_off</item> <!-- Use background that has color but not icon. --> 
     <item name="android:backgroundSplit">@drawable/gradient_lightpurple_darkpurple_off</item> <!-- Use background that has color but not icon. --> 
     <item name="android:titleTextStyle">@style/CustomWindowTitleText.ActionBar</item> 
     <item name="android:subtitleTextStyle">@style/CustomWindowSubTitleText</item> 

     <item name="background">@drawable/gradient_lightpurple_darkpurple_off</item> <!-- Use background that has color but not icon. --> 
     <item name="backgroundSplit">@drawable/gradient_lightpurple_darkpurple_off</item> <!-- Use background that has color but not icon. --> 
     <item name="titleTextStyle">@style/CustomWindowTitleText.ActionBar</item> 
     <item name="subtitleTextStyle">@style/CustomWindowSubTitleText</item> 
    </style> 

    <!-- Override properties in the default theme --> 
    <!-- NOTE: If you change the windowTitleTextSize you must explicitly the windowTitleSize property, the title bar will not re-size automatically, text will be clipped --> 
    <style name="JumbleeTheme" parent="Holo.Theme"> <!-- extends Theme.Sherlock --> 
     <item name="android:windowTitleStyle">@style/CustomWindowTitle</item> 
     <item name="android:windowTitleBackgroundStyle">@style/CustomWindowTitleBackground</item> 
     <item name="android:windowBackground">@drawable/gradient_off_darkpurple_off</item> 
     <item name="android:windowActionBar">true</item> 
     <item name="android:actionBarStyle">@style/CustomActionBar</item> 
     <item name="actionBarStyle">@style/CustomActionBar</item> 
    </style> 

    <style name="JumbleeTheme.GameScreen"> 
     <item name="android:windowBackground">@color/black</item> 
    </style> 


    <!-- Facebook Theme --> 

    <style name="CustomWindowTitleText.ActionBar.Facebook"> 
     <item name="android:textColor">@color/primary_text_white</item> 
    </style> 
    <!-- 
     http://actionbarsherlock.com/theming.html 
     Due to limitations in Android's theming system any theme customizations must be declared in two attributes. 
     The normal android-prefixed attributes apply the theme to the native action bar and the unprefixed attributes are for the custom implementation. 
    --> 
    <style name="CustomActionBar.Facebook"> 
     <item name="android:background">@drawable/background_window_title_facebook</item> <!-- Use background that has color but not icon. --> 
     <item name="android:backgroundSplit">@drawable/background_window_title_facebook</item> <!-- Use background that has color but not icon. --> 
     <item name="android:titleTextStyle">@style/CustomWindowTitleText.ActionBar.Facebook</item> 

     <item name="background">@drawable/background_window_title_facebook</item> <!-- Use background that has color but not icon. --> 
     <item name="backgroundSplit">@drawable/background_window_title_facebook</item> <!-- Use background that has color but not icon. --> 
     <item name="titleTextStyle">@style/CustomWindowTitleText.ActionBar.Facebook</item> 
    </style> 

    <!-- Facebook Sender Activity --> 
    <style name="FacebookSenderTheme" parent="Holo.Theme.Light"> 
     <item name="android:actionBarStyle">@style/CustomActionBar.Facebook</item> 
     <item name="actionBarStyle">@style/CustomActionBar.Facebook</item> 
    </style> 
</resources> 

E la fonte per primary_text_yellow

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_enabled="false" android:color="@color/text_light_disabled" /> 
    <item android:color="@color/app_yellow"/> 
</selector> 
+0

sembra che il colore del testo predefinito sia impostato su qualcosa che è probabilmente un drawable o impostato su null o qualcosa del genere. Nel tema dell'attività, qual è il TextViewStyle e la definizione TextAppearance associata? –

+0

Ciao Greg, ho aggiunto i dettagli sopra. L'unica volta che sovrascrivo TextAppearance è impostarlo su @ style/CustomWindowTitleText. – William

risposta

5

Questo è sicuramente un bug in diversi membri della serie di dispositivi Samsung Galaxy. Sono riuscito a replicarlo su un Galaxy Pocket ma non è stato in grado di replicarlo sull'emulatore per un AVD che era un piccolo GEPPB.

Ci è voluto un po 'per riprodursi. Si verifica quando sono presenti più di 6 voci di menu, in modo che premendo sul pulsante del menu hardware vengano visualizzate 5 voci più l'opzione di overflow "Altro". Facendo clic su "Altro" provoca l'arresto anomalo.

Il taglio del tema fino al seguente ha causato ancora l'errore.

<style name="CustomActionBar"> 
    <!-- No styles --> 
</style> 

<style name="JumbleeTheme" parent="Holo.Theme"> 
    <item name="android:actionBarStyle">@style/CustomActionBar</item> 
    <item name="actionBarStyle">@style/CustomActionBar</item> 
</style> 

Ma se si abbassa il tema al seguente, l'errore scompare.

<style name="CustomActionBar"> 
    <!-- No styles --> 
</style> 

<style name="JumbleeTheme" parent="Holo.Theme"> 
    <item name="actionBarStyle">@style/CustomActionBar</item> 
</style> 

Così, per qualche motivo i dispositivi Galaxy stavano guardando "android: actionBarStyle" anche se non dovrebbero essere e li mette in uno stato molto strano.

La soluzione che ho adottato era quella di creare una cartella delle risorse values-v11 in cui theme.xml ha riferimenti a "android: actionBarStyle" e tutti gli altri attributi di Honeycomb + ActionBar e nei miei valori \ theme.xml per utilizzare solo il Attributi ABS (ad esempio actionBarStyle/actionBarSize).

+0

Prima la domanda solo per informazioni: per quale versione dell'API hai compilato? E un commento: Galaxy Pocket ha uno schermo 240x320. Questo lo colloca in una gamma di dispositivi a bassa risoluzione. Action Bar Sherlock ha una cartella ldpi drawable vuota, dove non ne ha nemmeno uno. Ma i dispositivi gestiscono questo diferenzialmente. Ho una situazione in cui l'app funziona su Android 2.2 e non riesce su 4.3. È possibile verificare questa posabilità (grafica mancante in ldpi disegnabile) in modo da poter limitare il problema e magari creare un problema su Github? – Anderson

+0

lo avrei compilato per 4.3. Ben consapevole del fatto che Pocket è un dispositivo ldpi di piccole dimensioni, ma è anche Gingerbread. I dispositivi Gingerbread NON dovrebbero guardare all'attributo "android: actionBarStyle" come ActionBar è stato introdotto solo in Honeycomb. Rimuovendo questo attrito nei dispositivi pre Gingerbread consente ancora all'ABS di funzionare in quanto utilizza l'attributo "actionBarStyle". – William

22

Sono abbastanza sicuro che ho avuto questo stesso problema. Sono disposto a scommettere che non ha nulla a che fare con il sistema operativo. È causato da quella cosa in Android in cui è possibile sostituire uno Drawable per un altro a seconda del tema o di qualche altra condizione. Si scopre che il compilatore di risorse Android non controlla (sempre? Mai?) Se c'è qualcosa di "reale" dietro un alias.

Ecco come si esegue il debug è ...

Inizia con questa linea, ti dice qualcosa di specifico su ciò che manca - l'ID:

Caused by: android.content.res.Resources$NotFoundException: Resource is not a ColorStateList (color or path): TypedValue{t=0x1/d=0x7f0d014c a=3 r=0x7f0d014c}

Passare al bin/R.text, e cercare il codice ID che viene fornito: 0x7f0d014c. Ci dovrebbe essere qualcosa di simile: int attr actionModeCloseDrawable 0x7f0d014c

Ora cercare il nome actionModeCloseDrawable o qualunque cosa sia nell'area di lavoro. Credo che troverai che si tratta di un alias per una risorsa inesistente. vale a dire, c'è una configurazione (numero di versione, dimensione dello schermo, ecc.) in base alla quale quella attr non si associa a nulla.

Importanti cose da notare: Assicurati di controllare TUTTI i luoghi in cui trovi actionModeCloseDrawable o qualsiasi cosa sia. Potrebbe sembrare che si trovi in ​​un posto dove "non importa", ma questo è stato un secondo problema riscontrato: dopo aver risolto il problema in uno abc_myfragment.xml, ho dovuto risolverlo in abc_myfragment_large.xml - Android stava chiamando automaticamente un file xml diverso da quello specificato nel codice, in base al dispositivo su cui mi è capitato di eseguirlo.

La linea superiore del vostro stack trace dovrebbe aiutare a verificare che si sta cercando nel posto giusto: android.view.InflateException: Binary XML file line #45: Error inflating class

Questo indica che i dispersi ColorStateList cui ci si riferisce in una sezione di alcuni file XML da qualche parte, e che quella fastidiosa sezione inizia sulla linea 45 (cioè, è lì che la parentesi angolare aperta - "<" - inizia la sezione.)

PS Quello che voglio dire Alias ​​è uno di questi:

<attr name="abc_my_home_button" format="reference" />

che ottiene ulteriori definizioni distinte in due temi distinti:

<item name="afc_button_home">@drawable/afc_button_home_light</item> nel file themes_light.xml

e

<item name="afc_button_home">@drawable/afc_button_home_dark</item> nel file themes_dark.xml

Il problema sorge quando si esce dalla definizione finale da uno dei file del tema.

EDIT

Prossimo passo: Indagare CustomActionBar 's dipendenze. Non sono un esperto di stili, quindi supporrò che restino 9 possibili luoghi in cui Android potrebbe vedere un riferimento a uno ColorStateList che non riesce a trovare: nella parent di CustomActionBar (Widget.Sherlock.Light.ActionBar.Solid.Inverse) e in ciascuno degli 8 oggetti che contiene Commenta questi 8 articoli e sbarazzati del genitore, quindi riesegui la tua app nella configurazione problematica. Controlla se l'errore di runtime scompare o, più probabilmente, le modifiche (ad es. Numero di riga (e id) cambiano da # 45 per indicare CustomActionBar.Facebook invece, dove vengono invocate molte delle stesse risorse). Quindi annullare le modifiche una alla volta fino a quando l'errore non ritorna a quello che era prima. Ciò localizzerà ulteriormente il problema. Dopo aver tentato una correzione, spostati lentamente, poiché è possibile che, se trovi il problema (ad es. Come riferimento inesistente), venga replicato in più degli 8 elementi. Così il commento a uno a uno.

+0

Hi Merk, quel valore si associa all'attributo R $ style CustomActionBar = 0x7f0d014c; Che puoi vedere è definito sopra, è definito per tutte le configurazioni del dispositivo e viene fatto riferimento solo al tema theme.xml visualizzato sopra. – William

+0

vedi Modifica sezione sopra ... – Merk

+1

Grazie Merck. Questa non era la soluzione, ma mi hai dato abbastanza idee e hai messo abbastanza impegno nella tua risposta che ti stavo assegnando la taglia. Elencherò la soluzione tra un minuto. – William

2

Ricrea ogni file di risorse appena copiato da un altro progetto. Android non riconoscerà il file di risorse. creare un nuovo file di risorse e copiare e incollare il codice da quello vecchio a quello nuovo.Il nuovo file di risorse deve essere riconosciuto e i tuoi colori saranno ugualmente

1

Una soluzione rapida e semplice a questo problema è semplicemente il codice binario nella cartella del progetto. Questo darà il nome della variabile che si riferisce a quel valore. Per esempio nel mio caso è stato qualche cosa come questa -

myviewpager/R.java:  public static final int accent=0x7f0c0000; 

Dopo di che basta sostituire tutti i riferimenti per quella variabile (accento) nel progetto per il valore hardcoded definito corrispondente ad esso alcuni file XML nel progetto, nel mio caso era #009688. Questo ha risolto il problema nel mio caso.

Problemi correlati