Android简单实现ButterKnife Bind View功能

289 阅读1分钟

前言

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