Не удается настроить textColor из темы только в HTC Desire HD - PullRequest
4 голосов
/ 07 апреля 2011

Проблема:

Мое приложение работает нормально на большинстве устройств, но вылетает на 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'!(или что-то подобное!) Это может быть важной информацией!Могу ли я что-нибудь поменять в моем коде, чтобы он заработал ??

Ответы [ 5 ]

1 голос
/ 31 мая 2012

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

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

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

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

0 голосов
/ 16 ноября 2011

Недавно я столкнулся с подобной проблемой.Только для 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 часто приводят к меньшим проблемам, существует ошибка с мозаичными растровыми изображениями, котораятакже решается путем динамического размещения свойства плитки выше, чем в java (см. ошибка растрового изображения XML для растрового изображения tileMode? )

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

0 голосов
/ 07 июля 2011

Я решил решить эту проблему, переработав некоторые из моих файлов 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);  
}
0 голосов
/ 08 августа 2011

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

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

0 голосов
/ 07 апреля 2011

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

 android:textColor="?textColor"
...