使用 Android Support Annotations避免方法调用时传参错误
2023-09-27 14:27:30 时间
背景:
项目中有一个公用类,支持设置View的背景,第二个入参是颜色。
public static void setBackgroundColor(View view, int color) {
view.setBackgroundColor(color);
}
1. 初次使用时,使用了如下的传参方式,直接将color的资源id传入了,但是却发现显示出来的颜色不对。
setBackgroundColor(button,R.color.color_3F51B5);
上面代码对应的效果如右图按钮背景:
2. 后来才发现传参错误,应该穿color值,而不是color资源ID。
setBackgroundColor(button,ContextCompat.getColor(context,R.color.color_3F51B5));
预期效果如右图按钮背景:
思考:
虽然找到了问题原因,但是这样的错误很容易犯,是否有更好避免此类问题的方法呢?
解决方案:
1.引入annotations包依赖,如:compile "com.android.support:support-annotations:28.0.0"
implementation "com.android.support:support-annotations:28.0.0"
2.可以对输入参数增加注解,供编译环节校验参数合法性。修改代码定义,对color参数增加@ColorInt注解:
public static void setBackgroundColor(View view,@ColorInt int color) {
view.setBackgroundColor(color);
}
继续思考:
除了上面的注解,是否还有其他类似的注解?
全量注解介绍:
AnimatorRes | 表示int类型的参数,成员变量,或方法返回值是一个animator资源的引用 |
AnimRes | 表示int类型的参数,成员变量,或方法返回值是一个anim资源的引用 |
AnyRes | 表示int类型的参数,成员变量,或方法返回值是一个任意资源类型的引用 |
ArrayRes | 表示int类型的参数,成员变量,或方法返回值是一个array资源类型的引用 |
AttrRes | 表示int类型的参数,成员变量,或方法返回值是一个attr资源的引用 |
BoolRes | 表示int类型的参数,成员变量,或方法返回值是一个boolean资源的引用 |
ColorRes | 表示int类型的参数,成员变量,或方法返回值是一个color资源的引用 |
DimenRes | 表示int类型的参数,成员变量,或方法返回值是一个dimen资源的引用 |
DrawableRes | 表示int类型的参数,成员变量,或方法返回值是一个drawable资源的引用(包括@mipmap) |
FractionRes | 表示int类型的参数,成员变量,或方法返回值是一个fraction资源的引用 |
IdRes | 表示int类型的参数,成员变量,或方法返回值是一个id资源的引用 |
IntegerRes | 表示int类型的参数,成员变量,或方法返回值是一个int类型资源的引用 |
InterpolatorRes | 表示int类型的参数,成员变量,或方法返回值是一个interpolator资源的引用 |
LayoutRes | 表示int类型的参数,成员变量,或方法返回值是一个layout资源的引用 |
MenuRes | 表示int类型的参数,成员变量,或方法返回值是一个menu资源的引用 |
PluralsRes | 表示int类型的参数,成员变量,或方法返回值是一个plurals资源的引用 |
RawRes | 表示int类型的参数,成员变量,或方法返回值是一个raw资源的引用 |
StringRes | 表示int类型的参数,成员变量,或方法返回值是一个string资源的引用 |
StyleableRes | 表示int类型的参数,成员变量,或方法返回值是一个styleable资源的引用 |
StyleRes | 表示int类型的参数,成员变量,或方法返回值是一个style资源的引用 |
TransitionRes | 表示int类型的参数,成员变量,或方法返回值是一个transition资源的引用 |
XmlRes | 表示int类型的参数,成员变量,或方法返回值是一个xml资源的引用 |
ColorInt | 表示int颜色值 |
IntRange | 表示参数需要在给定的int或long范围内 |
FloatRange | 表示参数需要在给定的float范围内 |
NonNull | 表示参数不能为null |
Nullable | 表示参数可以为null |
Dimension | 表示int类型的参数,成员变量,或方法的返回值是尺寸大小 |
Px | 表示int类型的参数,成员变量,或方法的返回值是像素大小 |
CallSuper | 只用在方法上,表示任何重写该方法的子类,也应该调用该方法 |
CheckResult | 用来验证是否使用了方法返回值,可以通过添加注释来进行提示 |
安卓开发技术分享:https://blog.csdn.net/yinxing2008/article/details/84555061
相关文章
- 关于React Native Android找不到node的错误
- android打包方法超过65k错误
- Android初级开发是如何一步步成为高级开发?隔壁都馋哭了
- Android开发各类常见错误解决方案
- Android Studio:xxx is not an enclosing class 错误的解决方法
- android xml 布局错误
- android xml 布局错误(黑掉了)Missing styles. Is the correct theme chosen for this layout?
- Android : <com.mobeta.android.dslv.DragSortListView-引用自定义控件包名错误
- android中Post方式发送HTTP请求
- Android layoutInflate.inflate 方法具体解释,removeView()错误解决
- Android对ScrollView滚动监听,实现美团、大众点评的购买悬浮效果
- Android面试及资料合集
- Android ViewDataBinding之include与ViewStub的介绍与使用
- opencv在交叉编译的时候的一些常见报错和处理---How to use std::stoul and std::stoull in Android?
- Android dependency ‘xxx‘ has different version for the compile错误解决步骤
- 扫描二维码下载app,判断是Android还是ios,并跳转到不同的下载地
- studio构建错误Element uses-permission#android.permission.ACCESS_NETWORK_STATE at AndroidManifest.xml:38:
- 【错误记录】Android 可执行权限报错 ( Cannot run program “/data/user/0/cn.e/ffmpeg“: error=13,Permission denied )
- 【错误记录】Android 编译时技术报错 ( 注解处理器 process 方法多次调用问题 )
- Android常见错误
- Android多线程任务优化2:实现后台预读线程
- Android make sdk 错误解决
- ubuntu 11.10(32位系统)下编译android源码 make错误解决办法
- react-native 实现条码扫描(ios&android)
- android 真机调试出现错误 INSTALL_FAILED_INSUFFICIENT_STORAGE 的解决方法。
- 【错误记录】Android 中调用 Process 命令行执行指令 ( java.lang.IllegalThreadStateException: process hasn‘t exited )
- Android兼容性测试应该怎么做逼格更高呢?
- 【我的Android进阶之旅】解决Android Studio 运行gradle命令时报错: 错误: 编码GBK的不可映射字符
- 【我的Android进阶之旅】解决SVN Cleanup错误: Failed to run the WC DB work queue associated with
- 我的Android进阶之旅------>解决错误: java.util.regex.PatternSyntaxException: Incorrect Unicode property
- 我的Android进阶之旅------>解决如下错误failed to copy 'Settings2.apk' to '/system/app//Settings2.apk': Read-only
- Android Demo手机获取验证码
- 我的Android进阶之旅------>Android开发错误汇总