前言
ButterKnife想必大家都不陌生,大大简化了视图绑定操作,但毕竟是第三方项目,有些公司出于安全考虑可能不太愿意用第三方开源库,难道就不能“偷懒”了吗?当然不是,让我们一起来实现一个简单的视图绑定器,和ButterKnife一样的方便。
实现
创建注解接口
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Bind {
int value();
}
复制代码
创建注解解析类
public class ViewBinder {
public static void bind(Activity activity) {
bind(activity, activity.getWindow().getDecorView());
}
public static void bind(Object target, View source) {
Field[] fields = target.getClass().getDeclaredFields();
if (fields != null && fields.length > 0) {
for (Field field : fields) {
try {
field.setAccessible(true);
if (field.get(target) != null) {
continue;
}
Bind bind = field.getAnnotation(Bind.class);
if (bind != null) {
int viewId = bind.value();
field.set(target, source.findViewById(viewId));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
复制代码
使用
Activity
public class BindActivity extends Activity {
@Bind(R.id.tv_test)
TextView tvTest;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_bind);
ViewBinder.bind(this);
tvTest.setText("test");
}
}
复制代码
Fragment
public class BindFragment extends Fragment {
@Bind(R.id.tv_test)
TextView tvTest;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_bind, container);
ViewBinder.bind(this, view);
return view;
}
}
复制代码
ViewHolder
class ViewHolder {
@Bind(R.id.tv_test)
TextView tvTest;
public ViewHolder(View view) {
ViewBinder.bind(this, view);
}
}
复制代码
其他用法就不过多介绍了,大家自己举一反三。 用法是不是和ButterKnife一样简单!
实现原理
原理其实也很简单,利用了Android的注解(Annotation)功能,如果大家了解注解的用法就可以写出更多的注解框架。 代码比较简单,就不上传源码了。
迁移自我的简书 2016.02.29