简单实现ButterKnife的注解功能
来源:互联网 发布:手机做题软件 编辑:程序博客网 时间:2024/05/21 17:08
今天简单实现一个类似ButterKnife注解的功能——通过注解的方式,简化代码中View变量与XML资源绑定的流程。
ButterKnife使用的是CLASS级别的注解,在这里短平快,使用RUNTIME注解来模仿,会损失运行时性能。
首先,我们来看一下ButterKnife典型的使用场景:
@InjectView(R.id.title_text)TextView mTitleTextView;@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_activity); ButterKnife.inject(this); mTitleTextView.setText("test");}
在使用
ButterKnife.inject(this)
这一句代码后,就可以直接调用控件的方法了,前提只需要在声明控件变量时添加InjectView注解,并给定相应的R.id变量。
我们完全仿照这一流程:
首先定义一个注解InjectView
@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.FIELD)@Documentedpublic @interface InjectView { // 唯一的value是要指定的R.id变量 int value();}
在这里我们定义注解保留在运行时环境中,并且这个注解是应用在类中的FIELD上。
下面我们就能在Activity中使用这个注解了(虽然没有任何作用):
public class MainActivity extends AppCompatActivity { @InjectView(R.id.textview_a) TextView textViewA; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); }}
现在我们来实现注解的功能。起一个名为PoorKnife的类,声明一个static方法inject,并且接收一个Activity类型参数:
public class PoorKnife { public static void inject(Activity activity) { }}
接下来实现inject方法,主要用到反射机制:
1. 通过参数activity获得类变量
2. 遍历类中所有FIELD,并检查是否被标注InjectView注解
3. 若有注解,则获取注解给定的int值,并通过反射将findViewById得到的view赋值给这个field
代码如下:
public static void inject(Activity activity) { try { // 获取类变量 Class contextClass = Class.forName(activity.getClass().getCanonicalName()); // 遍历类中所有Field for (Field field : contextClass.getDeclaredFields()) { // 如果包含注解 if (field.isAnnotationPresent(InjectView.class)) { Log.d(TAG, field.getName() + " has annotation"); // 得到注解值 int rId = field.getAnnotation(InjectView.class).value(); String type = field.getType().toString(); if (type.endsWith("TextView")) { // 设置field可访问,并将通过set方法赋值view field.setAccessible(true); field.set(activity, activity.findViewById(rId)); } } } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); }}
接下来我们可以在Activity中使用这个方法初始化View了:
@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); PoorKnife.inject(this); textViewA.setText("PoorKnife succeed!!!");}
由于是运行时通过反射调用,因此效率相对较低,但使用上简化了view初始化的流程。绑定onClick按照这个流程也可以很方便的实现。
0 0
- 简单实现ButterKnife的注解功能
- 利用注解实现简单的ButterKnife
- 使用编译时注解简单实现类似 ButterKnife 的效果
- 简单实现ButterKnife(运行时注解)
- 简单实现ButterKnife(编译时注解)
- Android注解框架(ButterKnife的简单使用)
- java基础之注解(annotation)——实现一个简单的ButterKnife
- Android 框架学习2:使用编译时注解简单实现类似 ButterKnife 的效果
- SSH-使用注解整合实现简单的登录功能
- 使用ButterKnife注解框架实现View的点击操作
- 深入理解编译注解(六)Butterknife的实现原理
- ButterKnife的功能描述
- 注解开源库 butterknife的使用
- ButterKnife 注解框架的使用
- android注解ButterKnife的使用
- 实现数据库功能(GreenDao+butterknife)
- 通过反射实现的仿ButterKnife功能Demo
- 简单的butterknife使用方法
- Swift NSLayoutConstraint 加约束Constraint
- Zabbix监控配置 邮件 微信告警
- slickedit中如何添加.a库
- Redhat 7.2 中文显示及中文输入法设置
- 让人感觉点击到的圆角按钮
- 简单实现ButterKnife的注解功能
- UIWebView - 4
- 蓝桥杯:K好数
- 本地ie版本大于7.0,MsHtml中get_userAgent获取UA为MSIE7
- Android TextView使用HTML处理字体样式、显示图片等
- windows账户密码忘记解决办法
- ios关于用xib创建的cell 自动返回cell的高度问题!
- 使用Java代码在应用层获取Android系统属性
- leetcode.147. Insertion Sort List