2010-12-27 12 views
41

¿Hay una construida en la forma de comprobar para ver si existe un recurso o soy yo queda hacer algo como lo siguiente:¿Cómo puedo comprobar para ver si existe un recurso en Android

boolean result; 
int test = mContext.getResources().getIdentifier("my_resource_name", "drawable", mContext.getPackageName()); 
result = test != 0; 
+0

Que no parece una manera muy difícil de hacer esto. ¿Qué te está molestando en este método? –

+0

Quizás no, pero me gustan los complementos que hacen el manejo de errores para mí, en lugar de quedarse con try/finally en todas partes. – user432209

+0

No necesita ningún error al manejar aquí. Lee mi comentario a continuación. –

Respuesta

46

Según el javadoc no necesita el try catch: http://developer.android.com/reference/android/content/res/Resources.html#getIdentifier%28java.lang.String,%20java.lang.String,%20java.lang.String%29

si getIdentifier() devuelve cero, significa que no existe dicho recurso.
También 0 - es una identificación de recurso ilegal.

Entonces su variable booleana de resultado es equivalente a (test != 0).

De todos modos, su intento/finalmente es malo, porque todo lo que establece establece la variable de resultado como falsa incluso si se lanza una excepción del cuerpo de prueba: mContext.get..... y luego simplemente "vuelve a lanzar" la excepción después de salir de la cláusula . Y supongo que eso no es lo que quieres hacer en caso de excepción.

+3

¿Puedes dar un ejemplo, por favor? –

+0

¿Qué sucede si tengo "my_resource.png" y "my_resource.xml"? ¿Cómo puedo diferenciarlos entre ellos? –

22

El bloque try/catch en su código es totalmente inútil (y erróneo), ya que ni getResouces() ni arrojan una excepción.

Por lo tanto, getIdentifier(...) ya le devolverá todo lo que necesita. De hecho, si devuelve 0, entonces el recurso que está buscando no existe. De lo contrario, devolverá el identificador de recurso asociado ("0 is not a valid resource ID", de hecho).

Aquí el código correcto:

int checkExistence = mContext.getResources().getIdentifier("my_resource_name", "drawable", mContext.getPackageName()); 

if (checkExistence != 0) { // the resouce exists... 
    result = true; 
} 
else { // checkExistence == 0 // the resouce does NOT exist!! 
    result = false; 
} 
3

En caso de que alguien se está preguntando, la "my_resource_name" en

int checkExistence = mContext.getResources().getIdentifier("my_resource_name", "drawable", mContext.getPackageName()); 

es en realidad

String resourceName = String.valueOf(R.drawable.my_resource_name); 
int checkExistence = mContext.getResources().getIdentifier(resourceName , "drawable", mContext.getPackageName()); 
Cuestiones relacionadas