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(); } } } } } }
好的,就是这个简单。。。