• Android_注解+反射代替findViewById()


    最近没啥事,前段时间看到一个框架是使用的注解来代替findViewById()的然后就研究了,发现还是蛮容易的,下面就是注解的代码:

    import java.lang.annotation.Documented;
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    /**
     * @author kchang
     * @E-mail:kchang@163.com
     */
    @Target(ElementType.FIELD)//属性
    @Retention(RetentionPolicy.RUNTIME)//运行时执行
    @Documented
    public @interface InjectView {
        public int value() default -1;
    }

    Activity代码:

    import android.app.Activity;
    import android.os.Bundle;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.widget.TextView;
    
    public class MainActivity extends Activity {
        @InjectView(R.id.tv)
        private TextView textView;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            InjectUtil.autoInjectView(this);
            textView.setText("inject view test");
        }

    InjectUtil工具类的代码:

    import java.lang.reflect.Field;
    
    import android.app.Activity;
    
    /**注入框架
     * @author changkai
     * @E-mail:changkai244@163.com
     */
    public class InjectUtil {
        /**
         * 自动注入findViewById()
         * @param activity
         *         当前的activity
         */
        public static void autoInjectView(Activity activity) {
            Class<?> classAct = activity.getClass();
            //获取所有的变量
            Field[] fields = classAct.getDeclaredFields();
            for (Field field : fields) {
                if (field.isAnnotationPresent(InjectView.class)) {//判断是否为InjectView注解
                    InjectView injectView = field.getAnnotation(InjectView.class);//获取InjectView注解
                    int id = injectView.value();//获取注解的值
                    if (id > 0) {
                        field.setAccessible(true);//允许范围私有变量
                        try {
                            field.set(activity, activity.findViewById(id));//给当前的变量赋值
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }
    }

    好的,就是这个简单。。。

  • 相关阅读:
    php实现cookie加密解密
    三个php加密解密算法
    一个经典的PHP加密解密算法
    Webpack 核心模块 tapable 解析(转)
    详解基于vue,vue-router, vuex以及addRoutes进行权限控制
    编写一个插件
    详解css3 pointer-events(阻止hover、active、onclick等触发事件来
    Dockerfile HEALTHCHECK详解
    Dockerfile 指令 WORKDIR介绍
    NPM私有包部署到私有仓库
  • 原文地址:https://www.cnblogs.com/changkai244/p/4117985.html
Copyright © 2020-2023  润新知