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:[email protected]
 */
@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:[email protected]
 */
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();
                    }
                }
            }
        }
    }
}

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

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。