2013-02-21 3 views
2

Я пытаюсь получить идентификатор строки со значением «Привет» от strings.xml делать в следующем:getIdentifier() всегда возвращает 0

getContext().getResources().getIdentifier("Hello", "string", getContext().getPackageName()); 

возвращает 0. Почему это возвращение 0?

ответ

4

Поскольку вы передаете строковое значение , в то время как вы должны передать имя ресурса строки.

Посмотрите на метод подписи: getIdentifier(String name, String defType, String defPackage).

Когда ресурс не найден, возвращается 0, что согласуется с тем, что вы испытываете.

Edit:

  1. Использование getIdentifier() не рекомендуется - процитировать ссылка:

    Примечание: использование этой функции не рекомендуется. Гораздо эффективнее извлекать ресурсы по идентификатору, чем по имени.

  2. Я не знаю прямого способа получить идентификатор строки на основе значения данной строки. Однако я видел два обходных/хаки:

    1. Назовите все строки, для которых вы хотите, чтобы поиск будет выполняться так: stringN где N является, например, 0 на основе целого увеличивающиеся для каждого из строк. Вы в конечном итоге с уродливыми именами, как string0, string1 и т. Д. Затем вы выполните поиск самостоятельно - вы перебираете N, создаете строку ID: stringN, получите ее значение и проверьте соответствие. Это уродливо, на мой взгляд.

    2. Используйте Typed Array ресурс и поставьте все свои строки там. Это в основном то же, что и метод 1, но избегает создания неприятных, загрязняющих имен ресурсов.

+0

вы правы. Есть ли способ найти идентификатор из значения? – Klaasvaak

+0

@Klaasvaak Я не верю, что вы можете найти ресурс из его значения ... – Sam

+1

@ Klaasvaak, пожалуйста, см. В редакции. – andr

1

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

String rPackageName = mContext.getResources().getResourcePackageName(R.some.wellKnownResource); 

«rPackageName» это имя пакета, который вы должны перейти к функции

getIdentifier(String name, String defType, String defPackage) 
Смежные вопросы