zoukankan      html  css  js  c++  java
  • 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();
                        }
                    }
                }
            }
        }
    }

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

  • 相关阅读:
    入职外包一个月的感受!(读者投稿)
    作为架构风格的 REST 到底是什么
    PHP基础之查找
    PHP基础之排序
    PHP入门之数组
    PHP入门之函数
    PHP入门之流程控制
    PHP入门之类型与运算符
    DC-1靶机实战和分析
    【基础算法】 状态压缩DP---蒙德里安的梦想
  • 原文地址:https://www.cnblogs.com/changkai244/p/4117985.html
Copyright © 2011-2022 走看看