Ресурсы NotFoundException?
Я получаю отчеты о сбоях на рынке Android:
android.content.res.Resources$NotFoundException: Resource ID #0x....
Я получаю около 17 из них в неделю. Он указывает мне следующее в моем коде:
context.getResources().getDrawable(R.drawable.foo);
Этот ресурс определенно присутствует в папке my/drawable. У меня несколько сотен тысяч инсталляций, я не уверен, как это может случиться для некоторых пользователей, но работает для подавляющего большинства. Я хотел бы узнать, что происходит, потому что они не могут использовать приложение в этом состоянии. Любые идеи?
Спасибо
--------- Обновление ----------------------
Также я могу видеть запись для рассматриваемого drawable в моем файле R.java, выглядит так:
public static final int foo=0x7f020034;
Я делаю чистую сборку проекта, а затем сразу после этого делаю свою сборку релизов (без модификации кода между ними, чтобы дать возможность создания автоматической сборки eclipse, возможно, чтобы R файл пошатнулся)
Спасибо
Ответы
Ответ 1
Я получил это исключение:
Resources$NotFoundException: String resource ID
когда я использовал setText со значением int. Мне пришлось преобразовать его в String.
До:
myTextView.setText(obj.SomeIntProperty);
После:
myTextView.setText(String.valueOf(obj.SomeIntProperty));
Ответ 2
Появляются ли отчеты о сбоях из версии <= 1.6, и у вас есть определенные ресурсы только в квалифицированных папках, т.е. "drawable-mdpi"
, а не только "drawable"
? Если это так, прочитайте "Известные проблемы" внизу на этой странице.
Ответ 3
То же самое, что я нашел сегодня утром в своем приложении и нашел очень простое решение. проблема выглядит большой и сложной, но это не так.
Шаги, которые я последовал,
- Удалить папку bin it self
- Очистить проект
- Удалите приложение с вашего устройства.
- Запустите приложение и проверьте свой сценарий.
По моему мнению, он не должен повторять это исключение.
Причина. Когда вы создаете приложение R.java содержит весь адрес памяти, и бывает так, что этот адрес недействителен для следующего запуска.
Вторая причина. Если у вас есть приложение, поддерживающее режим lanscape и portrati, и если вы не написали XML файл ни для одного из них, это возможность, которая может привести к этому краху. и есть много шансов на проблемы с OutoFmemory и Memory, когда вы должны поддерживать оба режима. пожалуйста, подумайте об этом.
Ответ 4
Это произошло несколько раз, особенно на телефонах с низкой плотностью. Я также заметил, что в основном это происходит с 9-патч-изображениями.
Мое решение состояло в том, чтобы включить 9-патч-изображения в такие же папки ресурсов плотности, сколько я мог (mdpi, ldpi, hdpi, xdpi).
Ответ 5
Хех, не знаю, я действительно работаю над подобной проблемой, но это может быть так. Стоит отметить, что, хотя устройство может масштабировать ресурсы и макеты, оно не может их масштабировать. Поэтому, если у вас есть минимальные значения, установите их в AndroidManifest.xml. Сначала попробуйте добавить layout-ldpi и layout-small.
Полезным методом для регистрации, который был загружен, является привязка android:tag
к каждому корневому контейнеру XML файла вашего макета, а в onCreate()
после установки setContentView(R.id.layout)
просто распечатать значение тега. Он скажет вам, что загрузилось - вам все равно нужно подключить отверстие, добавив все возможные комбинации, если только для целей отладки.
также переименуйте свои чертежи в папку drawables-nodpi
, чтобы убедиться, что нет доступных чертежей. это отключает внутреннее масштабирование, делает APK меньше и не "выбирает" из любой другой доступной папки.
как только вы выясните, будут ли макеты или доступные, дополнительные показатели помогут вам найти основную причину. на данный момент сначала проверяйте макеты с помощью "всегда использовать" чертежи.
в понедельник, когда я вернусь в офис, я отправлю вам код метрик, используемый для измерения данных, захваченных в этом потоке - Какая часть Android отвечает за выбор правильного профиль ресурсов?
Ответ 6
Вы включили определенные коды, которые ссылаются на контент из Android SDK.
Например, я столкнулся с аналогичной проблемой один раз и когда я удалил строку
android:background="?android:attr/actionBarItemBackground"
из моего xml, все работает отлично снова.
Ответ 7
Это также может произойти, если ресурс, на который вы ссылаетесь (вызывается его ResA), в свою очередь ссылается на ресурс, который отсутствует (позволяет называть его ResB).
Android поднимет ResourceNotFoundException для ResA, хотя на самом деле отсутствует ResB. Такова жизнь!
В моем случае ResB был определен в значениях-swxxxdp, но не в значениях. Поэтому я получал это исключение на телефонах, но не на планшетах.
Ответ 8
В моем случае у меня был файл макета, который привел к сбою:
Я получил следующий журнал -
![введите описание изображения здесь]()
Это показало эту ссылку на мой фактический код:
![введите описание изображения здесь]()
Какова эта строка кода:
![введите описание изображения здесь]()
Я проверил имена папок файлового навигатора, как было предложено наиболее популярным ответом, и похоже, что ресурс, который предположительно отсутствует, находится в обычной папке layout
![введите описание изображения здесь]()
но при поиске в Project
файловом навигаторе, а не в файловом навигаторе Android
я смог убедиться, что не только файл с отсутствующим файлом отсутствует в обычной папке layout
, но я даже не имеют папку layout
без специального расширения.
![введите описание изображения здесь]()
Добавление каталога ресурсов Android в папку res
и вызов его layout
, а затем вставка ресурсов из вашей папки специальности (например layout-sw720dp
) в него исправила проблему для меня.
![введите описание изображения здесь]()
Это решение также будет работать для других папок, как предложено, таких как отсутствие файлов в drawable
, и только их наличие в drawable-xxhdpi
можно устранить, перемещая файл в drawable
и настраивая его по мере необходимости. Удачи вам!
Ответ 9
- Перейдите в Project > Clean...
- Выберите проект, затем нажмите "ОК".
- Перезапустите приложение.
Ответ 10
Ошибка может произойти, если файл макета портрета не определен. Это происходит не всегда, но, например, если пользователь быстро отключается и на телефоне, я предполагаю, что в этом случае система вызывает onCreate в портретной ориентации, прежде чем вызывать onCreate в ландшафте.