码迷,mamicode.com
首页 > 移动开发 > 详细

Android_注解+反射代替findViewById()

时间:2014-11-24 09:52:28      阅读:171      评论:0      收藏:0      [点我收藏+]

标签:android   style   blog   io   ar   color   os   使用   sp   

最近没啥事,前段时间看到一个框架是使用的注解来代替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();
                    }
                }
            }
        }
    }
}

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

Android_注解+反射代替findViewById()

标签:android   style   blog   io   ar   color   os   使用   sp   

原文地址:http://www.cnblogs.com/changkai244/p/4117985.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!