Android简易注解View(java反射实现)

一、引言

Android中通过findViewById在布局文件中找到需要的View,加入一个Activity里面有许多的View需要初始化,那将是一件很繁琐的事情。当然Google一下你会发现有很多Android Annotations框架。比如比较有名的“Android Annotations”,这样的框架很复杂,用起来也比较麻烦,还有一些BUG,第一次使用也花费了不少时间研究。也许你在项目中只希望用到 Inject View这个功能,又或者你想知道这个实现的原理是怎样的。本文主要是解决这两个问题,实现一个最简单的ViewInject.

二、原理

原理是在Activity加载好后通过找到Activity中使用注解的字段,再通过Java反射的方式,动态的给这个字段设置值。

1、首先你需要了解一下Java的注解是如何工作的,如果你不了解可以先看一下相关的资料,这个比较简答。首先定义我们的注解类:

 1 /**
 2  * view inect by id
 3  *
 4  * @author Lucky
 5  *
 6  */
 7 @Target(ElementType.FIELD)//表示用在字段上
 8 @Retention(RetentionPolicy.RUNTIME)//表示在生命周期是运行时
 9 public @interface ViewInject {
10     int value() default 0;
11 }

2、我们需要定义个BaseActivity,在这个类中来解析注解

 1 /**
 2  *
 3  * @author Lucky
 4  *
 5  */
 6 public abstract class BaseActivity extends FragmentActivity {
 7     /**
 8      * get content view layout id
 9      *
10      * @return
11      */
12     public abstract int getLayoutId();
13
14
15     @Override
16     protected void onCreate(Bundle savedInstanceState) {
17         super.onCreate(savedInstanceState);
18         setContentView(getLayoutId());
19         autoInjectAllField();
20     }
21     /**
22      * 解析注解
23      */
24     public void autoInjectAllField() {
25         try {
26             Class<?> clazz = this.getClass();
27             Field[] fields = clazz.getDeclaredFields();//获得Activity中声明的字段
28             for (Field field : fields) {
29                 // 查看这个字段是否有我们自定义的注解类标志的
30                 if (field.isAnnotationPresent(ViewInject.class)) {
31                     ViewInject inject = field.getAnnotation(ViewInject.class);
32                     int id = inject.value();
33                     if (id > 0) {
34                         field.setAccessible(true);
35                         field.set(this, this.findViewById(id));//给我们要找的字段设置值
36                     }
37                 }
38             }
39         } catch (IllegalAccessException e) {
40             e.printStackTrace();
41         } catch (IllegalArgumentException e) {
42             e.printStackTrace();
43         }
44     }
45 }

3、完成上面的步骤后就是如何去使用了,示例代码如下:

 1 public class TestActivity extends BaseActivity {
 2
 3     @ViewInject(R.id.claim_statement)
 4     private WebView mWebView;
 5
 6
 7     @Override
 8     public int getLayoutId() {
 9         // TODO Auto-generated method stub
10         return R.layout.activity_claim;
11     }
12
13 }

这样就可以了。几行代码可以大大的提高工作效率。

PS:推荐使用第三方完整的注解框架。

时间: 2024-11-09 17:57:56

Android简易注解View(java反射实现)的相关文章

spring注解完成java反射机制

一直觉得spring提供的注解装配bean机制非常的好,尤其是在做类似Java反射机制的时候太方便了,下面就依据项目需求进行一次记录,方便以后使用.需求一句话:为每家交易所自动加载指定的结算银行.需求分析:项目中需要适配很多家交易所,而每家交易所都有自己指定的结算银行,或者一家或者多家,那么项目在A交易所运行时,能够自动加载A家交易所指定的结算银行A1.A2,项目在B交易所运行时,能够自动加载B家交易所指定的结算银行B1.解决方案:1.通过配置文件为项目确定交易所的结算银行#Abanks=A1,

Android通过注解初始化View

一.引言 Android中通过findViewById在布局文件中找到需要的View,加入一个Activity里面有许多的View需要初始化,那将是一件很繁琐的事情.当然Google一下你会发现有很多Android Annotations框架.比如比较有名的"Android Annotations",这样的框架很复杂,用起来也比较麻烦,还有一些BUG,第一次使用也花费了不少时间研究.也许你在项目中只希望用到 Inject View这个功能,又或者你想知道这个实现的原理是怎样的.本文主要

Java反射学习总结终(使用反射和注解模拟JUnit单元测试框架)

本文是Java反射学习总结系列的最后一篇了,这里贴出之前文章的链接,有兴趣的可以打开看看. http://blog.csdn.net/a396901990/article/category/2302221 本文介绍了如何利用反射和注解去简单的模拟JUnit4单元测试框架,之所以选择JUnit4是因为4.0以后最大的改进就是使用了注解.需要注意的是这里并不是完全的模拟,只是简单实现了一下Runner类和JUnit注解相关的工作流程.所以本文的主要目的是介绍反射和注解的使用.废话不多说,直接进入正文

Java反射及其在Android中的应用学习总结

一. Java反射机制 Reflection 是Java被视为动态(或准动态)语言的一个关键性质.这个机制同意程序在执行时透过Reflection APIs取得不论什么一个已知名称的class的内部信息,包含其modifiers(诸如public, static 等等).superclass(比如Object).实现之interfaces(比如Serializable).也包含fields和methods的全部信息,并可于执行时改变fields内容或调用methods(包含被声明为private

Java反射机制的原理及在Android下的简单应用

花了几天时间,研究了一下Java的反射机制.在这里总结一下这几天学习的成果,一来分享自己的学习过程和在学习中遇到的问题,二来是给像我一样不太了解Java反射机制的同学做一个简单的介绍.在文章后面会链接一个Android反射机制的应用程序. 一.反射的概念及在Java中的类反射 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.在计算机科学领域,反射是一类应用,它们能够自描述和自控制.这类应用通过某种机制来实现对自己行为的描述和检测,并能根据自身行为的状态和结果,调整或修改应用所描述

Android中Java反射技术的使用示例

import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import android.os.Bundle; import android.app.Activity; /** * Demo描述: * Android中Java反射技术的使用示例 * 在Java中描述字节码文件(xxx.class)的类叫Class * 反射的过程可视为剖析Class的过

JAVA反射与注解实例

1    JAVA反射机制 JAVA反射机制是在运行状况中,号码大全关于恣意一个类,关键词挖掘工具都能够晓得这个类的一切特点和办法:关于恣意一个目标,都能够调用它的恣意一个办法和特点:这种动态获取的信息以及动态调用目标的办法的功能称为java言语的反射机制.或许说,JAVA反射机制指的是咱们能够于运行时加载.探知.运用编译时间完全不知道的classes.换句话说,Java程序能够加载一个运行时才得知称号的class,得悉其完好结构(但不包括methods界说),并生成其目标实体.或对其field

java反射注解的用途

很多人都知道java的反射机制和注解技术.反射(Reflection)就是加载类,并解剖出类的各个组成部分:而Annotation 其实就是代码里的特殊标记, 它用于替代配置文件,也就是说,传统方式通过配置文件告诉类如何运行,有了注解技术后,开发人员可以通过注解告诉类如何运行.那么两者结合能够产生出什么? 首先来看下面一个程序 回想我们以前产生Connection的方法,我是都是在配置文件中配置好driver,url,username,password,而现在我们利用反射加注解可以利用方法上注解

java.lang.NoClassDefFoundError: android.support.v4.view.ViewConfigurationCompat

Recently I am trying to run the sliding menu examples which was given in this blog: http://www.curious-creature.org/2012/12/14/android-recipe-3-sliding-menu-layers-and-filters/; 1. download library prject from github; 2. Inside the main project, righ