美文网首页Android进阶之旅
Android简单实现ButterKnife Bind View

Android简单实现ButterKnife Bind View

作者: 王晨彦 | 来源:发表于2016-02-29 19:13 被阅读2004次

    前言

    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)功能,如果大家了解注解的用法就可以写出更多的注解框架。
    代码比较简单,就不上传源码了。

    相关文章

      网友评论

        本文标题:Android简单实现ButterKnife Bind View

        本文链接:https://www.haomeiwen.com/subject/qupgkttx.html