Android-注解

2019-10-21  本文已影响0人  cao苗子

1.解释:

注解只是一个标识(标记),没有具体的功能代码。

package com.miaozi.android_day03;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * created by panshimu
 * on 2019/10/9
 * @interface 代表注解
 */

@Target(ElementType.FIELD)// 代表放在哪里 FIELD代表属性 METHOD方法 TYPE类
@Retention(RetentionPolicy.RUNTIME)//什么时候起作用 RUNTIME运行时 CLASS编译时 SOURCE编程时
public @interface ViewById {
    int value();//代表参数 多个参数放数组也行
}

2.通过注解和反射实现findViewById

package com.miaozi.android_day03;

import android.app.Activity;
import android.view.View;

import java.lang.reflect.Field;

/**
 * created by panshimu
 * on 2019/10/9
 */
public class ViewUtil {
    public static void inject(Activity activity){
        //获取所有的属性
        Field[] declaredFields = activity.getClass().getDeclaredFields();
        //过滤关于ViewById的属性
        for(Field field : declaredFields){
            ViewById annotation = field.getAnnotation(ViewById.class);
            if(annotation!=null){
                //执行findViewById
                View viewById = activity.findViewById(annotation.value());
                //反射注入
                field.setAccessible(true);
                try {
                    field.set(activity,viewById);
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

使用:

    @ViewById(R.id.tv)
    private TextView tv;
上一篇下一篇

猜你喜欢

热点阅读