Подтвердить что ты не робот

Ресурсы 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 файл пошатнулся)

Спасибо

4b9b3361

Ответ 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 в ландшафте.