我已经创建了一个扩展 ImageView 的小自定义 View 。我的自定义 View 提供了一个方法 showError(int)
,我可以在其中传递一个资源 ID,它应该显示为 ImageView 内容。如果我可以传递一个简单的颜色资源 ID 或可绘制资源 ID,那就太好了。
我的问题是:如何确定传递的资源 ID 是 Drawable 还是 Color?
我目前的做法是这样的:
class MyImageView extends ImageView{
public void showError(int resId){
try{
int color = getResources().getColor(resId);
setImageDrawable(new ColorDrawable(color));
}catch(NotFoundException e){
// it was not a Color resource so it must be a drawable
setImageDrawable(getResources().getDrawable(resId));
}
}
}
这样做安全吗?我的假设是,资源 ID 确实是独一无二的。我的意思是在 R.drawable 或 R.color 中不是唯一的,但在 R
中是完全唯一的
所以没有
R.drawable.foo_drawable = 1;
R.color.foo_color = 1;
NHẬN DẠNG 1
将只分配给其中一个资源而不分配给两者是否正确?
您可能想从资源中查找 TypedValue
,以便确定该值是 Màu sắc
还是 Có thể vẽ được
.像这样的东西应该可以在不需要抛出和捕获异常的情况下工作:
TypedValue value = new TypedValue();
getResources().getValue(resId, value, true); // will throw if resId doesn't exist
// Check whether the returned value is a color or a reference
if (value.type >= TypedValue.TYPE_FIRST_COLOR_INT && value.type <= TypedValue.TYPE_LAST_COLOR_INT) {
// It's a color
setImageDrawable(new ColorDrawable(value.data));
} else if (value.type == TypedValue.TYPE_REFERENCE) {
// It's a reference, hopefully to a drawable
setImageDrawable(getResources().getDrawable(resId));
}
Tôi là một lập trình viên xuất sắc, rất giỏi!