Установка textColor с темы не работает только на HTC Desire HD

Проблема:

Мое приложение отлично работает на большинстве устройств, но падает на HTC Desire HD (Android 2.2.1). ( Изменить: ошибка все еще существует в 2.3.3)

Класс исключений – android.content.res.Resources$NotFoundException .

Исходный метод – Resources.loadColorStateList()

Деталь:

Я устанавливаю textColor с помощью Темы. Я объявляю textColor в TextView в XML-файле макета …

 <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"/> 

И объявить, что textColor для каждой темы должно быть в файле темы ресурсов …

 <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> 

Если я просто закодировал textColor в моем xml-файле, он отлично работает, поэтому кажется, что он не понимает, что '?textColor' должен заставить его посмотреть мой файл themes.xml. Опять же, это отлично работает на других устройствах, на которых я тестировал, но не работает на HTC Desire HD.

Ошибка:

Соответствующие биты трассировки стека …

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

а также

 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) 

Изменить: Eclipse 3.5.2 сообщает мне «Невозможно разрешить значение цвета»? TextColor »в атрибуте« textColor »на вкладке« Графическое макет »моего layout.xml. Тем не менее, я все еще могу компилировать и создавать, и он по-прежнему работает на всех других устройствах, кроме HTC Desire HD. Полный код находится в нижней части этого вопроса.

Изменить: 1 июля 2011

Я заметил, что у меня есть две отдельные трассировки стека (хотя его единственная 1 линия ближе к концу, которая меняется, я думаю) …

 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 

а также

 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 

Редактировать: 4 июля – Полный код

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> 

Редактирование: 5 июля 2011 г. Я обнаружил, что если я использую «android: textColorPrimary», а не «textColor», ошибка больше не возникает в HTC Desire HD, но цвет текста всегда останется значением по умолчанию для textColor. На всех устройствах он работает отлично, как ожидалось.

Редактировать: 6 июля 2011 г. Раннее утро В принципе, HTC Desire HD, похоже, игнорирует любые значения, установленные с помощью??. Несмотря на половину исправления, описанного в моем последнем изменении, я получаю ошибки позже в своем приложении на страницах, где используются стили.

Редактирование: 6 июля 2011 г. Поздно вечером я исправил проблему, грубо установив цвет текста на Java (в зависимости от темы). Тем не менее, это еще не работает для моего текста в моем ListView, который использует «стиль». Тем не менее, теперь я обнаружил, что вся остальная часть моей программы работает нормально, несмотря на использование «textColor»! Это означает, что только вступительный экран не работает, что указывает на то, что HTC Desire HD не создает требуемые темы или стили, достаточно ранние, чтобы расшифровать «textColor»! (Или что-то в этом роде!) Это может быть важная информация! Могу ли я поменять место в моем коде, чтобы он работал?

Вы отмечаете в своих комментариях, что вы вызываете setTheme в Activity, а не задаете тему активности в манифесте. Убедитесь, что вы вызываете setTheme перед вызовом super.onCreate и вызовом setContent в методе жизненного цикла onCreate. Это предотвратит использование любой темы по умолчанию перед вашей темой.

Я подозреваю, что вы используете «? TextColor» в своем XML-макете, но это значение определяется только в ваших настраиваемых тем и по умолчанию на некоторых устройствах. Другие устройства не имеют определенного значения для значения в теме по умолчанию.

Сообщения об ошибках – это какое-то значение, получаемое там, которое заканчивается решением для ресурса, который не может использоваться в качестве цвета текста. Цвет текста обычно представляет собой список состояний XML, который указывает цвет, используемый для определенных состояний, например сфокусированный, хотя, если вам нужен одинаковый цвет для всех состояний, иногда используется прямой ресурс цвета.

Как я уже упоминал в другом комментарии, большинство тем, которые я видел, не имеют значения textColor напрямую. Вместо этого они имеют textViewStyle, который указывает на стиль, который затем имеет textColor. Вы можете попробовать colorForeground, если хотите повлиять на большее количество вещей. Часто textViewStyle будет указывать файл списка состояний XML для textColor, который затем будет использовать colorForeground для цвета для определенных состояний.

Этот фрагмент не нужен. Тема должна вступить в силу без явного указания стиля в вашем макете в любом месте.

  android:textColor="?textColor" 

В конечном итоге я решил исправить эту проблему, переработав некоторые из моих файлов xml и Java. Это не кажется идеальным, потому что это создает несоответствие в коде и чрезмерно усложняет то, что темы упрощают. Однако, чтобы обслуживать пользователей HTC Desire HD, я поддался этому. Если кто-нибудь может найти альтернативное решение, отправьте его здесь.

Как бы то ни было, я исправил свой код, установив цвета текста в статических методах Java, таких как …

 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); } } 

Или путем создания различных стилей в styles.xml (по одному для каждого цвета текста) и вызова соответствующего кода 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); } 

«?» Синтаксис должен ссылаться на стиль в текущей теме, задаете ли вы свою тему в манифесте? Я не вижу его в коде, который вы предоставили, поэтому я предполагаю, что он установлен, он выполняется там. (И, вероятно, это причина другого комментария Джима – ваш ответ указывает, что он не установлен).

Кроме того, вы дважды определили атрибут textColor – один раз в theme.xml и снова в attrs.xml. Как любое устройство знает, к какому из них вы обращаетесь? Потому что вы используете "?" Синтаксис, система должна знать, чтобы искать атрибут стиля, но я не думаю, что он явно проверяет тип ресурса. Фактически, действительный синтаксис включает тип ресурса, он может помочь иметь «? Style / textColor». Кроме того, попробуйте называть другой «attrTextColor», чтобы различать его и атрибуты «textColor» в вашей теме. (Кроме того, «textColor» кажется мне неправильным именем атрибута, потому что его можно смутить с помощью атрибута «android: textColor» – возможно, вы должны называть его «txtoolsTextColor» или что-то еще. Так как система должна знать, чтобы посмотреть в вашем пакете Для ресурса «textColor» это действительно не имеет значения … кроме того, что у вас есть ошибка, и это может быть причиной …)

Недавно я столкнулся с подобной проблемой. Только для Galaxy S 4G я получал следующую ошибку при раздувании вида:

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

Этот код ошибки совершенно бесполезен, оказалось, что было бы более полезно посмотреть на вершину трассировки стека, где я нашел:

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

Затем, посмотрев на XML-файл в строке 804, я обнаружил, что это проблема с настройкой android: cacheColorHint. Хотя у меня есть настраиваемая тема, она не применяется к моему ListView, а cacheColorHint просто жестко закодирован. Исправление было простым, так как выше было установлено динамически в java: listview.setCacheColorHint.

Кажется, что некоторые переменные вида в java, а не в XML часто приводят к меньшему количеству проблем, есть ошибка с черепичными растровыми изображениями, которые также решаются путем определения свойства tile динамически, чем в java (см. XML-drawable Bitmap tileMode bug? )

Кажется, что для некоторых моделей телефона и макетов макет раздувается до того, как весь XML был декодирован. Но это гипотеза или, по крайней мере, эвристический подход к решению этих проблем.