是否有内置的方法来检查资源是否存在,或者我是否仍然执行以下操作:
boolean result;
int test = mContext.getResources().getIdentifier("my_resource_name", "drawable", mContext.getPackageName());
result = test != 0;
答案 0 :(得分:54)
根据javadoc你不需要try catch: http://developer.android.com/reference/android/content/res/Resources.html#getIdentifier%28java.lang.String,%20java.lang.String,%20java.lang.String%29
如果getIdentifier()
返回零,则表示不存在此类资源
此外0 - 是非法资源ID。
所以你的结果布尔变量等价于(test != 0)
。
无论如何你的try / finally都很糟糕,因为即使从try:mContext.get.....
的主体抛出异常,它也会将结果变量设置为false,然后它就会在退出后“重新抛出”异常最后一句。而且我想这不是你想要做的例外情况。
答案 1 :(得分:25)
代码中的try / catch块完全没用(和错误),因为getResources()
和getIdentifier(...)
都没有抛出异常。
因此,getIdentifier(...)
已经为您提供所需的一切。实际上,如果它将返回0,那么您正在寻找的资源不存在。否则,它将返回相关的资源标识符("0 is not a valid resource ID",确实)。
这里有正确的代码:
int checkExistence = mContext.getResources().getIdentifier("my_resource_name", "drawable", mContext.getPackageName());
if ( checkExistence != 0 ) { // the resource exists...
result = true;
}
else { // checkExistence == 0 // the resource does NOT exist!!
result = false;
}
答案 2 :(得分:3)
如果有人想知道,
中的"my_resource_name"
int checkExistence = mContext.getResources().getIdentifier("my_resource_name", "drawable", mContext.getPackageName());
实际上是
String resourceName = String.valueOf(R.drawable.my_resource_name);
int checkExistence = mContext.getResources().getIdentifier(resourceName , "drawable", mContext.getPackageName());
答案 3 :(得分:2)
我喜欢这样做:
public static boolean isResource(Context context, int resId){
if (context != null){
try {
return context.getResources().getResourceName(resId) != null;
} catch (Resources.NotFoundException ignore) {
}
}
return false;
}
所以现在它不仅适用于可绘制的