Android简单实现ButterKnife Bind View功能

前言

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



作者:ChayWong
链接:https://www.jianshu.com/p/3e0b071c1eb7
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章