android - getidentifier - getresources() getstringarray
Android GetIdentifier no funciona para la cadena? (5)
Como un enfoque alternativo, puede utilizar la reflexión:
R.string.class.getField("string_name").getInt(null);
Lo que esencialmente hace el truco al obtener un campo de la clase por nombre y luego obtener el valor entero.
Pasamos nulo como objeto porque todos los recursos generados en el campo son estáticos y, por lo tanto, no forman parte de un objeto.
Es posible que deba manejar algunas excepciones (NoSuchFieldException, etc.) en caso de que haya cometido un error tipográfico, pero funciona.
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 demás 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 se ve como el 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 trates de evitar esto y trates de entender por qué no funciona:
1) En primer lugar, intente encontrar el siguiente campo declarado en su proyecto / proyectos:
About_EmailPrompt
Si está utilizando eclips, debe presionar Ctrl + H y abrir la pestaña Búsqueda de Java
Si obtiene resultados para la búsqueda, vaya al paso 2, de lo contrario, vaya al paso 3
2) Debes obtener el resultado como jerarquía.
<YOUR_PACKAGE_NAME> -- R -- string -- About_EmailPrompt
2.1) verifique que escriba el nombre correcto del paquete en su código
.getIdentifier("About_EmailPrompt", "string", <YOUR_PACKAGE_NAME>);
2.2) verifica que uses solo símbolos latinos en tus cadenas literales:
"About_EmailPrompt"
y
"string"
2.3) verifique que use solo símbolos latinos en el atributo de name
en strings.xml
<string name="About_EmailPrompt">SOME_VALUE</string>
3) Si no tienes ningún resultado de búsqueda.
3.1) compruebe que usa solo símbolos latinos en su cadena literal:
"About_EmailPrompt"
3.2) verifique que use solo símbolos latinos en el atributo de name
en strings.xml
<string name="About_EmailPrompt">SOME_VALUE</string>
3.3) Limpia y construye para todos los proyectos que tienes
PS Si esto no le ayuda, intente reiniciar su IDE (a veces eclipse generar R.java incorrectamente hasta reiniciar)
He logrado obtener una solución de trabajo en mi aplicación. Por lo tanto, en función de la pregunta original, deberá cambiarla de la siguiente manera:
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 funcionar de esta manera.
Podría crear un método para reemplazar todos los getIdentifier
-calls. De lo contrario, tiene que mezclar dos enfoques diferentes, lo que hace que el código sea un poco confuso.
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 úsalo así:
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. Source
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 cuerdas en lugar de cuerdas