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();
                        }
                    }
                }
            }
        }
    }

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

  • 相关阅读:
    JDBC 查询的三大参数 setFetchSize prepareStatement(String sql, int resultSetType, int resultSetConcur)
    有空必看
    SpringMVC 利用AbstractRoutingDataSource实现动态数据源切换
    FusionCharts JavaScript API Column 3D Chart
    FusionCharts JavaScript API
    FusionCharts JavaScript API
    Extjs 继承Ext.Component自定义组件
    eclipse 彻底修改复制后的项目名称
    spring 转换器和格式化
    Eclipse快速生成一个JavaBean类的方法
  • 原文地址:https://www.cnblogs.com/changkai244/p/4117985.html
Copyright © 2011-2022 走看看