Android getIdentifier no funciona para la cadena?

Realmente no sé por qué, pero no puedo recuperar el Id de una cadena.

Este es mi código:

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

Pero funciona perfectamente para todas las otras clases de archivo R:

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

Así que realmente no entiendo lo que está pasando aquí, alguna idea?

Este código parece código correcto:

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

Y debería funcionar, pero si no te aconsejo que no intentes evitar esto y tratar de entender por qué no funciona:

1) En primer lugar tratar de encontrar siguiente campo declarado en su proyecto / proyectos:

 About_EmailPrompt 

Si está utilizando eclips debe presionar Ctrl + H y abrir la pestaña de búsqueda de Java Diálogo de búsqueda de Java

Si obtiene resultados para buscar, vaya al paso 2, de lo contrario vaya al paso 3

2) Usted debe obtener resultado como jerarquía

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

2.1) comprueba que escribes el nombre correcto del paquete en tu código

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

2.2) comprueba que solo uses símbolos latinos en tus cadenas literales:

 "About_EmailPrompt" 

y

 "string" 

2.3) comprueba que solo uses símbolos latinos en el atributo name en strings.xml

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

3) Si no tiene un resultado de búsqueda

3.1) comprueba que usas solo símbolos latinos en tu cadena literal:

 "About_EmailPrompt" 

3.2) comprueba que solo uses símbolos latinos en el atributo de name en strings.xml

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

3.3) Limpiar y construir para todos los proyectos que tenga

PS Si esto no te ayuda, intenta reiniciar tu IDE (a veces eclipse genera R.java incorrectamente hasta reiniciar)

Como un enfoque alternativo, puede utilizar la reflexión:

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

Lo que esencialmente hace el truco por obtener un campo de la clase por nombre y luego obtener el valor entero.

Pasamos null como el objeto porque todos los campos generados por los recursos son estáticos y por lo tanto no forman parte de un objeto.

Puede que necesite manejar algunas excepciones (NoSuchFieldException, etc) en caso de que haya cometido un error tipográfico, pero funciona.

He conseguido una solución de trabajo en mi aplicación. Por lo tanto, basándose en la pregunta original, tendría que cambiarlo como el siguiente:

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

Esta es otra forma de escribir el método getIdentifier (), pero parece que funciona de esta manera.

Puede crear un método para reemplazar todos los getIdentifier -calls. De lo contrario hay que mezclar dos enfoques diferentes, lo que hace que el código sea un poco poco claro.

Este enfoque es similar a la solución de @ shalafi y utiliza la reflexión.

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

Y utilizarlo de esta manera:

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

Si utiliza

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

Es incluso más rápido que getIdentifier() o la solución anterior. Fuente

Tengo estas funciones:

 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()); } 

Creo que deberías usar cadenas en lugar de cadena

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.