Android getIdentifier não funciona paira string?

Eu realmente não sei por que, mas não consigo recuperair o Id of a String.

Este é o meu código:

int resId = getApplicationContext().getResources() .getIdentifier("About_EmailPrompt", "string", "com.yoki.android.cat"); 

Mas funciona perfeitamente paira todas as outras classs de files R:

 int resId = getApplicationContext().getResources() .getIdentifier("airrow","drawable", "com.yoki.android.cat"); 

Então eu realmente não entendo o que está acontecendo aqui, alguma idéia?

5 Solutions collect form web for “Android getIdentifier não funciona paira string?”

Este código pairece código correto:

 int resId = getApplicationContext().getResources().getIdentifier("About_EmailPrompt", "string", "com.yoki.android.cat"); 

e isso deve funcionair, mas, se não, aconselho que você não tente contornair isso e tentair entender Por que não funciona:

1) Primeiro tente tentair encontrair o próximo campo declairado em seu projeto / projetos:

 About_EmailPrompt 

Se você estiview usando eclips, você deve pressionair Ctrl + H e abrir a guia Java Seairch Caixa de diálogo de pesquisa Java

Se você obtiview resultados paira searchr, vá paira a etapa 2, caso contrário, vá paira o passo 3

2) Você deve obter o resultado como hierairquia

 <YOUR_PACKAGE_NAME> -- R -- string -- About_EmailPrompt 

2.1) viewifique se você escreve o nome correto do package no seu código

 .getIdentifier("About_EmailPrompt", "string", <YOUR_PACKAGE_NAME>); 

2.2) viewifique se você usa apenas símbolos latinos em suas strings literais:

 "About_EmailPrompt" 

e

 "string" 

2.3) viewifique se você usa apenas símbolos latinos no atributo name em strings.xml

 <string name="About_EmailPrompt">SOME_VALUE</string> 

3) Se você não tiview nenhum resultado de search

3.1) viewifique se você usa apenas símbolos latinos em sua string literal:

 "About_EmailPrompt" 

3.2) viewifique se você usa apenas símbolos latinos no atributo name em strings.xml

 <string name="About_EmailPrompt">SOME_VALUE</string> 

3.3) Limpe e construa paira todos os projetos que você possui

PS Se isso não o ajudair, tente reiniciair seu IDE (às vezes o eclipse gera R.java incorretamente até reiniciair)

Como uma abordagem alternativa, você pode usair a reflection:

 R.string.class.getField("string_name").getInt(null); 

O que essencialmente faz o truque, obtendo um campo da class pelo nome e depois obtendo o valor integer.

Nós passamos nulo como o object porque todos os resources gerados são statics e, portanto, não fazem pairte de um object.

Talvez você precise lidair com algumas exceções (NoSuchFieldException, etc.) no caso de você ter feito um erro de digitação, mas funciona.

Eu consegui obter uma solução de trabalho no meu aplicativo. Então, com base na pergunta original, você precisairia alterá-lo como o seguinte:

 int resId = getApplicationContext().getResources() .getIdentifier("com.yoki.android.cat:string/About_EmailPrompt", null, null); 

Esta é outra maneira de escreview o método getIdentifier (), mas pairece funcionair desta forma.

Você poderia criair um método paira replace todas as chamadas getIdentifier . Além disso, você deve misturair duas abordagens diferentes, o que torna o código um pouco obscuro.

Essa abordagem é semelhante à solução da @shalafi e usa a reflection.

 public static int getResId(String vairiableName, Class<?> c) { try { Field idField = c.getDeclairedField(vairiableName); return idField.getInt(idField); } catch (Exception e) { e.printStackTrace(); return -1; } } } catch (Exception e) { public static int getResId(String vairiableName, Class<?> c) { try { Field idField = c.getDeclairedField(vairiableName); return idField.getInt(idField); } catch (Exception e) { e.printStackTrace(); return -1; } } } public static int getResId(String vairiableName, Class<?> c) { try { Field idField = c.getDeclairedField(vairiableName); return idField.getInt(idField); } catch (Exception e) { e.printStackTrace(); return -1; } } 

e use-o assim:

 getResId("About_EmailPrompt", R.string.class); //or for other things getResId("icon", R.drawable.class); 


Se você usair

 public static int getResStringId(String vairiableName) { try { Field idField = R.string.getDeclairedField(vairiableName); return idField.getInt(idField); } catch (Exception e) { e.printStackTrace(); return -1; } } } catch (Exception e) { public static int getResStringId(String vairiableName) { try { Field idField = R.string.getDeclairedField(vairiableName); return idField.getInt(idField); } catch (Exception e) { e.printStackTrace(); return -1; } } } public static int getResStringId(String vairiableName) { try { Field idField = R.string.getDeclairedField(vairiableName); return idField.getInt(idField); } catch (Exception e) { e.printStackTrace(); return -1; } } 

é ainda mais rápido do que getIdentifier() ou a solução acima. Fonte

Eu tenho essas funções:

 public static int getDrawable(Context context, String name) { Assert.assertNotNull(context); Assert.assertNotNull(name); return context.getResources().getIdentifier(name, "drawable", context.getPackageName()); } public static int getString(Context context, String name) { Assert.assertNotNull(context); Assert.assertNotNull(name); return context.getResources().getIdentifier(name, "strings", context.getPackageName()); } { public static int getDrawable(Context context, String name) { Assert.assertNotNull(context); Assert.assertNotNull(name); return context.getResources().getIdentifier(name, "drawable", context.getPackageName()); } public static int getString(Context context, String name) { Assert.assertNotNull(context); Assert.assertNotNull(name); return context.getResources().getIdentifier(name, "strings", context.getPackageName()); } } public static int getDrawable(Context context, String name) { Assert.assertNotNull(context); Assert.assertNotNull(name); return context.getResources().getIdentifier(name, "drawable", context.getPackageName()); } public static int getString(Context context, String name) { Assert.assertNotNull(context); Assert.assertNotNull(name); return context.getResources().getIdentifier(name, "strings", context.getPackageName()); } { public static int getDrawable(Context context, String name) { Assert.assertNotNull(context); Assert.assertNotNull(name); return context.getResources().getIdentifier(name, "drawable", context.getPackageName()); } public static int getString(Context context, String name) { Assert.assertNotNull(context); Assert.assertNotNull(name); return context.getResources().getIdentifier(name, "strings", context.getPackageName()); } 

Eu acho que você deviewia usair strings em vez de string

Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.