El ajuste textColor de un tema falla sólo en HTC Desire HD

Problema:

Mi aplicación funciona bien en la mayoría de los dispositivos, pero se bloquea en HTC Desire HD , (Android 2.2.1). ( Editar: Error sigue existiendo en 2.3.3)

Clase de excepción – android.content.res.Resources$NotFoundException .

Método de origen – Resources.loadColorStateList()

Detalle:

Estoy configurando textColor usando Temas. Declaro el textColor en el TextView en el archivo xml de la disposición …

 <TextView android:id="@+id/accountWarning" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/accountWarning" android:textSize="20sp" android:layout_marginTop="10dp" android:padding="10dp" android:textColor="?textColor"/> 

Y declarar lo que el textColor para cada tema debe estar en el archivo de tema de recursos …

 <style name="Theme.TxtoolsDark" parent="Theme"> <item name="textColor">#FFFFFF</item> <item name="autoCompleteTextViewTextColor">#000</item> </style> <style name="Theme.TxtoolsLight" parent="Theme" > <item name="textColor">#000</item> <item name="autoCompleteTextViewTextColor">#000</item> </style> 

Si sólo hardcode el textColor en mi archivo xml, funciona bien, por lo que parece no ser '?textColor' entender que '?textColor' debe hacer que mirar mi archivo themes.xml. Una vez más, esto funciona bien en otros dispositivos que he probado, pero falla en el HTC Desire HD.

Error:

Los bits relevantes del seguimiento de la pila son …

 android.view.InflateException: Binary XML file line #10: Error inflating class <unknown> 

y

 Caused by: android.content.res.Resources$NotFoundException: File res/drawable-hdpi/scrollbar_handle_vertical.9.png from drawable resource ID #0x0: .xml extension required at android.content.res.Resources.loadColorStateList(Resources.java:1842) at android.content.res.TypedArray.getColorStateList(TypedArray.java:342) at android.widget.TextView.<init>(TextView.java:665) 

Edit: Eclipse 3.5.2 me informa 'No se puede resolver el valor de color "? TextColor" en el atributo "textColor"' en la ficha Diseño gráfico de mi layout.xml. Sin embargo, todavía puedo compilar y construir, y todavía funciona en todos los demás dispositivos que no sean HTC Desire HD. El código completo está en la parte inferior de esta pregunta.

Edición: 1 de julio de 2011

He notado que tengo dos rastros separados de la pila (aunque su solamente 1 línea cerca del extremo que varía, pienso) …

 java.lang.RuntimeException: Unable to resume activity {uk.co.txttools.mobile.android.txttoolsmobile/uk.co.txttools.mobile.android.txttoolsmobile.pages.home.HomeTabs}: java.lang.RuntimeException: Unable to resume activity {uk.co.txttools.mobile.android.txttoolsmobile/uk.co.txttools.mobile.android.txttoolsmobile.pages.home.StandardHome}: android.view.InflateException: Binary XML file line #10: Error inflating class <unknown> at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3399) at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3420) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2864) at android.app.ActivityThread.access$2300(ActivityThread.java:136) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2179) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:143) at android.app.ActivityThread.main(ActivityThread.java:5073) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:521) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) at dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.RuntimeException: Unable to resume activity {uk.co.txttools.mobile.android.txttoolsmobile/uk.co.txttools.mobile.android.txttoolsmobile.pages.home.StandardHome}: android.view.InflateException: Binary XML file line #10: Error inflating class <unknown> at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3399) at android.app.LocalActivityManager.moveToState(LocalActivityManager.java:170) at android.app.LocalActivityManager.dispatchResume(LocalActivityManager.java:521) at android.app.ActivityGroup.onResume(ActivityGroup.java:58) at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1260) at android.app.Activity.performResume(Activity.java:4011) at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3389) ... 12 more Caused by: android.view.InflateException: Binary XML file line #10: Error inflating class <unknown> at android.view.LayoutInflater.createView(LayoutInflater.java:513) at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:563) at android.view.LayoutInflater.rInflate(LayoutInflater.java:618) at android.view.LayoutInflater.rInflate(LayoutInflater.java:621) at android.view.LayoutInflater.inflate(LayoutInflater.java:407) at android.view.LayoutInflater.inflate(LayoutInflater.java:320) at android.view.LayoutInflater.inflate(LayoutInflater.java:276) at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:217) at android.app.Activity.setContentView(Activity.java:1701) at uk.co.txttools.mobile.android.txttoolsmobile.pages.home.Home.createHomePage(Home.java:88) at uk.co.txttools.mobile.android.txttoolsmobile.pages.home.StandardHome.createHomePage(StandardHome.java:74) at uk.co.txttools.mobile.android.txttoolsmobile.pages.home.Home.onResume(Home.java:291) at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1260) at android.app.Activity.performResume(Activity.java:4011) at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3389) ... 18 more Caused by: java.lang.reflect.InvocationTargetException at android.widget.TextView.<init>(TextView.java:355) at java.lang.reflect.Constructor.constructNative(Native Method) at java.lang.reflect.Constructor.newInstance(Constructor.java:446) at android.view.LayoutInflater.createView(LayoutInflater.java:500) ... 33 more Caused by: android.content.res.Resources$NotFoundException: File res/drawable-hdpi/scrollbar_handle_vertical.9.png from drawable resource ID #0x0: .xml extension required at android.content.res.Resources.loadColorStateList(Resources.java:1842) at android.content.res.TypedArray.getColorStateList(TypedArray.java:342) at android.widget.TextView.<init>(TextView.java:665) ... 37 more 

y

 java.lang.RuntimeException: Unable to resume activity {uk.co.txttools.mobile.android.txttoolsmobile/uk.co.txttools.mobile.android.txttoolsmobile.pages.home.HomeTabs}: java.lang.RuntimeException: Unable to resume activity {uk.co.txttools.mobile.android.txttoolsmobile/uk.co.txttools.mobile.android.txttoolsmobile.pages.home.StandardHome}: android.view.InflateException: Binary XML file line #10: Error inflating class <unknown> at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2485) at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2506) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1856) at android.app.ActivityThread.access$1500(ActivityThread.java:132) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1038) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:143) at android.app.ActivityThread.main(ActivityThread.java:4293) 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:839) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) at dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.RuntimeException: Unable to resume activity {uk.co.txttools.mobile.android.txttoolsmobile/uk.co.txttools.mobile.android.txttoolsmobile.pages.home.StandardHome}: android.view.InflateException: Binary XML file line #10: Error inflating class <unknown> at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2485) at android.app.LocalActivityManager.moveToState(LocalActivityManager.java:170) at android.app.LocalActivityManager.dispatchResume(LocalActivityManager.java:521) at android.app.ActivityGroup.onResume(ActivityGroup.java:58) at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1242) at android.app.Activity.performResume(Activity.java:4004) at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2475) ... 12 more Caused by: android.view.InflateException: Binary XML file line #10: Error inflating class <unknown> at android.view.LayoutInflater.createView(LayoutInflater.java:518) at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:568) at android.view.LayoutInflater.rInflate(LayoutInflater.java:623) at android.view.LayoutInflater.rInflate(LayoutInflater.java:626) at android.view.LayoutInflater.inflate(LayoutInflater.java:408) at android.view.LayoutInflater.inflate(LayoutInflater.java:320) at android.view.LayoutInflater.inflate(LayoutInflater.java:276) at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:231) at android.app.Activity.setContentView(Activity.java:1742) at uk.co.txttools.mobile.android.txttoolsmobile.pages.home.Home.createHomePage(Home.java:88) at uk.co.txttools.mobile.android.txttoolsmobile.pages.home.StandardHome.createHomePage(StandardHome.java:74) at uk.co.txttools.mobile.android.txttoolsmobile.pages.home.Home.onResume(Home.java:291) at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1242) at android.app.Activity.performResume(Activity.java:4004) at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2475) ... 18 more Caused by: java.lang.reflect.InvocationTargetException at java.lang.reflect.Constructor.constructNative(Native Method) at java.lang.reflect.Constructor.newInstance(Constructor.java:415) at android.view.LayoutInflater.createView(LayoutInflater.java:505) ... 33 more Caused by: android.content.res.Resources$NotFoundException: Resource is not a ColorStateList (color or path): TypedValue{t=0x2/d=0x7f010001 a=-1} at android.content.res.Resources.loadColorStateList(Resources.java:1822) at android.content.res.TypedArray.getColorStateList(TypedArray.java:342) at android.widget.TextView.<init>(TextView.java:693) at android.widget.TextView.<init>(TextView.java:382) ... 36 more 

Edición: 4 de julio – Código completo

Themes.xml

 <?xml version="1.0" encoding="utf-8"?> <resources> <style name="Theme" parent="android:Theme"> </style> <style name="Theme.TxtoolsDark" parent="Theme"> <item name="textColor">#FFFFFF</item> <item name="autoCompleteTextViewTextColor">#000</item> </style> <style name="Theme.TxtoolsLight" parent="Theme" > <item name="textColor">#000</item> <item name="autoCompleteTextViewTextColor">#000</item> </style> </resources> 

Attrs.xml

 <?xml version="1.0" encoding="utf-8"?> <resources> <attr name="autoCompleteTextViewTextColor" format="reference|color" /> <attr name="textColor" format="reference|color" /> </resources> 

MyLayoutFile.xml

 <?xml version="1.0" encoding="utf-8"?> <ScrollView android:id="@+id/ScrollView01" android:layout_width="fill_parent" android:layout_height="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android"> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:scrollbars="vertical" android:scrollbarAlwaysDrawVerticalTrack="true"> <TextView android:id="@+id/accountWarning" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/accountWarning" android:textSize="20sp" android:layout_marginTop="10dp" android:padding="10dp" android:textColor="?textColor"/> <TextView android:id="@+id/haveAccountQuestion" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/haveAccountQuestion" android:textSize="20sp" android:layout_gravity="center_horizontal" android:padding="10dp" android:textColor="?textColor"/> <Button android:id="@+id/yes" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="10dp" android:width="80dp" android:text="@string/yesHappy" android:textSize="15sp" android:layout_gravity="center_horizontal"/> <Button android:id="@+id/no" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="10dp" android:width="80dp" android:text="@string/noSad" android:textSize="15sp" android:layout_gravity="center_horizontal" android:layout_marginTop="10dp"/> <ListView android:id="@android:id/list" android:layout_width="wrap_content" android:layout_height="wrap_content" android:cacheColorHint="#00000000"/> </LinearLayout> </ScrollView> 

He descubierto que si utilizo 'android: textColorPrimary' en lugar de 'textColor', el error ya no se produce en HTC Desire HD, pero el color del texto siempre seguirá siendo el sistema textColor predeterminado. En todos los dispositivos, funciona perfectamente como se esperaba.

Editar: 6 de julio de 2011 Early Morning Básicamente, HTC Desire HD parece ignorar cualquier valor establecido con un '?'. A pesar de la media corrección descrita en mi última edición, recibo errores más adelante en mi aplicación en las páginas donde se utilizan estilos.

Edición: 6 de julio de 2011 Tarde de la tarde Tengo la mitad de arreglar el problema mediante el ajuste crudo del color de texto en Java (dependiendo del tema). Sin embargo, esto todavía no funciona para mi el texto en mi ListView que utiliza un "estilo". Sin embargo, ahora he descubierto que todo el resto de mi programa funciona bien, a pesar de usar '? TextColor'! Esto implica que sólo la pantalla de apertura no funciona, lo que indica que el HTC Desire HD no crea los temas o estilos necesarios lo suficientemente pronto como para descifrar '? TextColor'! (O algo así!) Esto podría ser información crucial! ¿Podría cambiar algo en mi código para que funcione?

Usted menciona en sus comentarios que está llamando a setTheme en la actividad en lugar de establecer el tema en la actividad en el manifiesto. Asegúrese de que está llamando a setTheme antes de la llamada super.onCreate y la llamada a setContent en el método onCreate del ciclo de vida de esa actividad. Esto evitará que cualquier tema predeterminado se utilice antes del tema.

Lo que sospecho que está sucediendo es que usted está usando "? TextColor" en su XML de la disposición, pero este valor se define solamente en sus temas de encargo y en los temas del defecto en algunos dispositivos. Otros dispositivos no tienen un valor definido para eso en el tema predeterminado.

Los mensajes de error son un poco de valor que se pone allí que termina por resolver a un recurso que no se puede utilizar como un color de texto. El color del texto suele ser una lista de estado XML que especifica el color que se utiliza para ciertos estados, como centrado, aunque si se desea el mismo color para todos los estados se utiliza a veces un recurso de color directo.

Como mencioné en otro comentario, la mayoría de los temas que he visto no tienen un valor textColor directamente. En su lugar tienen un textViewStyle que apunta a un estilo que tiene un textColor. Es posible que desee probar colorForeground si desea afectar más cosas. A menudo, el textViewStyle especificará un archivo de lista de estado XML para el textColor que luego utilizará el colorForeground para el color de ciertos estados.

Este fragmento no es necesario .. el tema debe tener efecto sin especificar explícitamente el estilo en su diseño en cualquier lugar.

  android:textColor="?textColor" 

Eventualmente opté por solucionar este problema al volver a trabajar algunos de mis archivos XML y Java. Esto no se siente ideal, porque crea inconsistencia dentro del código, y exagera algo que los temas están ahí para simplificar. Sin embargo, para atender a los usuarios de HTC Desire HD, he sucumbido a ella. Si alguien puede encontrar una solución alternativa, publícala aquí.

Loosely hablando, fijé mi código fijando colores de texto dentro de métodos estáticos de Java tales como este …

 public static void setTextColor(TextView tv) { if (CURRENT_THEME==TXTTOOLS_LIGHT){ tv.setTextColor(Color.BLACK); } else if (CURRENT_THEME==TXTTOOLS_DARK){ tv.setTextColor(Color.WHITE); } } 

O creando varios estilos dentro de styles.xml (uno para cada color de texto) y llamando al relevante en el código Java.

 SimpleCursorAdapter logins; if (Theme.getTheme()==Theme.TXTTOOLS_LIGHT){ logins = new SimpleCursorAdapter(this, R.layout.username_row_light_theme, c, from, to); } else if (Theme.getTheme()==Theme.TXTTOOLS_DARK){ logins = new SimpleCursorAdapter(this, R.layout.username_row_dark_theme, c, from, to); } 

Los "?" Sintaxis es hacer referencia a un estilo en el tema actual, ¿establece su tema en el Manifiesto? No lo veo en el código que proporcionó, así que supongo que si se establece, se hace allí. (Y esa es probablemente la razón del comentario del otro Jim – su respuesta indica que no se está estableciendo.)

Además, ha definido un atributo "textColor" dos veces: una vez en themes.xml y de nuevo en attrs.xml. ¿Cómo sabe un dispositivo a cuál se está refiriendo? Porque está utilizando el "?" Sintaxis, el sistema debe saber buscar un atributo de estilo, pero no creo que compruebe explícitamente el tipo de recurso. De hecho, la sintaxis válida incluye el tipo de recurso, podría ayudar a tener "? Style / textColor". También, intente llamar al otro "attrTextColor" para distinguirlo entre los atributos "textColor" en su tema. (También, "textColor" me parece un nombre de atributo incorrecto porque podría ser confundido con el atributo "android: textColor" – tal vez debería nombrarlo "txtoolsTextColor" o algo más, ya que el sistema debe saber buscar en su paquete Para el recurso "textColor", realmente no debería importar … excepto que usted tiene un error y esto podría ser la causa …)

Me encontré con un problema similar recientemente. Por sólo el Galaxy S 4G estaba recibiendo el siguiente error al inflar una vista:

 Caused by: android.content.res.Resources$NotFoundException: File res/drawable-hdpi/scrollbar_handle_vertical.9.png from drawable resource ID #0x0: .xml extension required 

Este código de error es bastante inútil, resultó ser más útil para mirar en la parte superior de la pila de seguimiento, donde encontré:

 ComponentInfo{com.staircase3.opensignal/com.staircase3.opensignal.library.Tab_Overview}: android.view.InflateException: Binary XML file line #804: Error inflating class </code> 

Luego mirando el archivo XML en cuestión en la línea 804 encontré que era un problema con la configuración de android: cacheColorHint. Aunque tengo un tema personalizado, no se aplica a mi ListView y cacheColorHint fue simplemente hardcoded. La solución era sencilla, como se ha definido anteriormente dinámicamente en java: listview.setCacheColorHint.

Parece que ciertas variables de vista en java en lugar de XML a menudo conduce a menos problemas, hay un error con mapas de bits de mosaico que también se resuelve por seeting la propiedad de azulejos dynamicallyr ather que en java (ver XML Drawmap Bitmap tileMode?

Parece como si, para ciertos modelos de teléfono y diseños, el diseño se infló antes de que todo el XML se ha decodificado. Pero esto es conjetura, o al menos una manera heurística de abordar estos problemas.

  • Establecer el color específico de ColorStateList mediante programación
  • Cambiar el color de texto de NumberPicker
  • Androide ColorStateList creado mediante programación y aplicado a TextColor
  • Android Linkify enlaces textColor ignorado, estilo CSS anula posible?
  • Configuración de Android Textcolor que se ignora para 5.0, pero funciona para 6.0
  • Cómo cambiar el color del texto del hilandero
  • Configuración del tema de aplicación textColor a blanco causas Contexto El texto del elemento de menú debe ser blanco (invisible)
  • Android HoneyComb DatePicker Color del texto
  • Cómo cambiar el color de entrada del imput en xml?
  • Establecer el color de texto de Android TextView de forma programática con setTextColor () procesa android: duplicateParentState inválido
  • Cambiar el color de texto de un solo ClickableSpan cuando se presiona sin afectar a otros ClickableSpans en el mismo TextView
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.