android 简单粗暴的注解初始化View学习

原理是在Activity加载好后通过找到Activity中使用注解的字段,再通过Java反射的方式,动态的给这个字段设置值。

1定义一个注解接口

/**
 * view inect by id
 * 
 * @author Lucky
 * 
 */
@Target(ElementType.FIELD)//表示用在字段上
@Retention(RetentionPolicy.RUNTIME)//表示在生命周期是运行时
public @interface ViewInject {
    int value() default 0;
}

2、我们需要定义个BaseActivity,在这个类中来解析注解

/**
 * 
 * @author Lucky
 * 
 */
public abstract class BaseActivity extends FragmentActivity {
    /**
     * get content view layout id
     * 
     * @return
     */
    public abstract int getLayoutId();


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(getLayoutId());
        autoInjectAllField();
    }
    /**
     * 解析注解
     */
    public void autoInjectAllField() {
        try {
            Class<?> clazz = this.getClass();
            Field[] fields = clazz.getDeclaredFields();//获得Activity中声明的字段
            for (Field field : fields) {
                // 查看这个字段是否有我们自定义的注解类标志的
                if (field.isAnnotationPresent(ViewInject.class)) {
                    ViewInject inject = field.getAnnotation(ViewInject.class);
                    int id = inject.value();
                    if (id > 0) {
                        field.setAccessible(true);
                        field.set(this, this.findViewById(id));//给我们要找的字段设置值
                    }
                }
            }
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        }
    }
}

3:这样来使用

public class TestActivity extends BaseActivity {

    @ViewInject(R.id.claim_statement)
    private WebView mWebView;
        

    @Override
    public int getLayoutId() {
        // TODO Auto-generated method stub
        return R.layout.activity_claim;
    }

}

相对于androidannotations,BufferKnife更简单的粗暴,要是不仅仅限于findbyID 就根据需求去选择这两种比较常用的注解框架

原文地址:https://www.cnblogs.com/yujian-bcq/p/5056864.html