Android-ресурсы, преобразующиеся в строку TypedValue warning
Хорошо, я смотрю прямо что-то здесь.
Каждый раз, когда я нахожусь в своем приложении, и я меняю действия, logcat сообщает серии предупреждений:
02-04 14:42:36.524: WARN/Resources(1832): Converting to string: TypedValue{t=0x12/d=0x0 a=2 r=0x7f08002b}
02-04 14:42:36.524: WARN/Resources(1832): Converting to string: TypedValue{t=0x12/d=0x0 a=2 r=0x7f08002c}
02-04 14:42:36.524: WARN/Resources(1832): Converting to string: TypedValue{t=0x12/d=0x0 a=2 r=0x7f08002d}
Другие приложения не показывают таких предупреждений. Это предварительная версия/сжатие?
Ответы
Ответ 1
Вы используете ресурс bool, где ожидается строка.
Вы можете найти, какой ресурс используется некорректно, открыв ваш сгенерированный файл R.java и выполнив поиск идентификаторов ресурсов из сообщения logcat:
0x7f08002b
0x7f08002c
0x7f08002d
Все три должны быть из вашего файла bool.xml( "t = 0x12" в предупреждающем сообщении означает, что ресурсы TYPE_INT_BOOLEAN).
Затем найдите, где эти идентификаторы ресурсов используются в вашем проекте (возможно, макет xml, но может быть где угодно) и убедитесь, что типы совпадают.
Вот пример TextView, который будет генерировать это сообщение журнала. Если в моих res/values /bool.xml у меня есть:
<resources>
<bool name="foo_flag">false</bool>
</resources>
Я могу неправильно ссылаться на него из XML файла макета:
<TextView android:id="@+id/foo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@bool/foo_flag"></TextView>
Когда я запустил это приложение, я получу предупреждающее сообщение, так как "текст" ожидает строковый ресурс, а не bool (мое приложение выглядит так, как ожидалось, хотя, поскольку флаг преобразуется в строку "false" ).
Ответ 2
Эти предупреждения появлялись только тогда, когда была включена определенная опция разработчика.
Настройки устройствa > Параметры разработчикa > Отключить "Включить проверку атрибута просмотра"
Ответ 3
Я обнаружил, что это предупреждение также выводится при указании строки множественного числа из виджета, который требует параметров.
Например:
<plurals name="song_count">
<item quantity="one">%d song in playlist</item>
<item quantity="other">%d songs in playlist</item>
</plurals>
Предупреждение появится при раздувании активности, содержащей виджет, ссылающийся на него:
<TextView
android:id="@+id/tv_total_songs"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@plurals/song_count" />
Вы, несомненно, замените строку после раздувания представлений, чтобы установить правильные параметры, например:
playlistSongCount.setText(
getResources().getQuantityString(
R.plurals.song_count,
songCount,
songCount));
Очевидным решением здесь является удаление атрибута android:text
из макета, поскольку он не имеет никакой цели.
Ответ 4
Проверьте, нет ли у вас: -
<TextView android:text="@+id/labelText"/>
в файле ресурсов.
Ответ 5
Проблема в android:text="@+id/fooText
Попробуйте изменить свой .xml:
<TextView
android:id="@+id/foo"
android:text="@+id/fooText"/>
Для этого:
<TextView
android:id="@+id/foo"
android:text=""/>
Ответ 6
В моем случае проблема была в ListPreference
умолчанию ListPreference
. Даже если вы введете его как String
(например, "10"
), он будет интерпретирован как int
а затем преобразован в String
и, следовательно, будет жаловаться.
Например, это даст предупреждение:
<ListPreference
android:defaultValue="10"
...
/>
но это не будет
<ListPreference
android:defaultValue="@string/ten"
...
/>
и определите @string/ten
в strings.xml
как:
<string name="ten" translatable="false">10</string>
Тупой, но это избавляет от предупреждения.