注解在android程序中的使用

何为注解:

在Java其中,注解又叫做“元数据”,它为我们在源码中加入信息提供了一种形式化的方法。让我们能在以后的某个时间方便的使用这些数据。更确切的说,注解在一定的程度上将数据与元代码进行了绑定,并非将数据保存在外部文件里。当然。这里仅仅介绍Android开发相关的技术。至于注解我会在Java学习总结篇中进行具体的研究和总结。那么。接下来我们一个实例来介绍注解在android开发中的巧妙应用。

实例描写叙述:

在这里。我们使用注解替换掉android中初始化资源对象的findViewById(...)方式,详细例如以下代码所看到的:

我的项目结构:

注解部分:

ContentView.java:

/**

* inject contentview

*/

@Target(ElementType.TYPE)

@Retention(RetentionPolicy.RUNTIME)

public @interface ContentView {

int value() default 0;

}

InjectView.java:

/**

* inject view of contentview

*/

@Target(ElementType.FIELD)

@Retention(RetentionPolicy.RUNTIME)

public @interface ViewInject {

int value();

int parentResId() default 0;

}

资源初始化部分:

ViewInjectObj.java:

int parentResId;

Object value;

@Override

public boolean equals(Object obj) {

boolean result;

if(this == obj) {

result = true;

}

if(!(obj instanceof ViewInjectObj)) {

result = false;

}

ViewInjectObj that = (ViewInjectObj) obj;

if(parentResId != that.parentResId) {

result = false;

}

if(null == value) {

return result = (null == that.value);

}

result = value.equals(that.value);

return result;

}

@Override

public int hashCode() {

int result = value.hashCode();

result = 35 * result + parentResId;

return result;

}

@Override

public String toString() {

return "ViewInjectObj [parentResId=" + parentResId + ", value=" + value

+ "]";

}

ViewSelector.java:

/**

* find view id resources

*/

public class ViewSelector {

private Activity currActivity;

private View currView;

public ViewSelector(Activity activity) {

currActivity = activity;

}

public ViewSelector(View view) {

currView = view;

}

public View findViewById(int id) {

return null == currView ? currActivity.findViewById(id) : currView.findViewById(id);

}

public View findViewByInfo(ViewInjectObj info) {

return findViewById((Integer) info.value, info.parentResId);

}

public View findViewById(int id,int pId) {

View pView = null;

if(0 < pId) {

pView = findViewById(pId);

}

View currView = null;

if(null != pView) {

currView = pView.findViewById(id);

} else {

currView = findViewById(id);

}

return currView;

}

}

映射方法部分:

InjectConfig.java:

/**

* inject view methods

*/

public class InjectConfig {

static final String TAG = "InjectConfig";

public InjectConfig() {

}

// inject contentview

public void injectContentView(Object obj,Class<?

> objClass) {

ContentView contentView = objClass.getAnnotation(ContentView.class);

if(null != contentView) {

try {

Method method = objClass.getMethod("setContentView", int.class);

method.invoke(obj, contentView.value());

} catch(Throwable tr) {

Log.e(TAG, tr.getMessage(), tr);

}

}

}

// inject view

public void injectView(Object obj,ViewSelector viewSelector,Class<?> objClass) {

Field[] fields = objClass.getDeclaredFields();

if(null != fields && 0 < fields.length) {

for(Field field : fields) {

ViewInject viewInject = field.getAnnotation(ViewInject.class);

if(null != viewInject) {

try {

View view = viewSelector.findViewById(viewInject.value(), viewInject.parentResId());

if(null != view) {

field.setAccessible(true);

field.set(obj, view);

}

} catch(Throwable tr) {

Log.e(TAG, tr.getMessage(), tr);

}

}

}

}

}

}

调用工具部分:

ViewUtilSvc.java:

public class ViewUtilSvc {

static InjectConfig config = null;

public static void inject(Activity activity) {

inject(activity,new ViewSelector(activity));

}

public static void inject(View view) {

inject(view,new ViewSelector(view));

}

public static void inject(Object obj, View view) {

inject(obj, new ViewSelector(view));

}

static void inject(Object obj,ViewSelector viewSelector) {

if(null == config) {

config = new InjectConfig();

}

Class<?> objClass = obj.getClass();

config.injectContentView(obj, objClass);

config.injectView(obj, viewSelector, objClass);

}

}

前台显示部分:

MainActivity.java:

@ContentView(R.layout.activity_main)

public class MainActivity extends FragmentActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

// setContentView(R.layout.activity_main);

ViewUtilSvc.inject(this);

if (savedInstanceState == null) {

getSupportFragmentManager()

.beginTransaction()

.add(R.id.container, new PlaceholderFragment())

.commit();

}

}

public static class PlaceholderFragment extends Fragment {

@ViewInject(R.id.tvHelloWorld)

TextView tvHelloWorld;

public PlaceholderFragment() {

}

@Override

public View onCreateView(LayoutInflater inflater, ViewGroup container,

Bundle savedInstanceState) {

View rootView = inflater.inflate(R.layout.fragment_main, container,false);

ViewUtilSvc.inject(this,rootView);

String hello = getResources().getString(R.string.text_helloworld_tv);

tvHelloWorld.setText(hello);

return rootView;

}

}

}

正如上面代码所看到的,我们使用了注解在代码中动态的加入了数据。然后借助反射机制来获得注解的数据;

使用了@ContentView(...) 替代了原生的setContentView(...)部分。使用了ViewUtilSvc.inject(...)进行相应的注射就可以。另外,这种做的目的就是为了简化对象视图的初始化工作。详细的执行效果图例如以下所看到的:

好了,到这里我们的TextView上的hello world最终显示出来了。假设有不论什么问题的话,请在评论中进行发问讨论。

/**

* 技术交流QQ群

*/

注解在android中的使用的更多相关文章

  1. Android中通过注解代替findViewById方法

    转自:http://www.2cto.com/kf/201405/302998.html 这篇文章主要讲解注解实现findViewById的功能,首先我们来熟悉一下在java中怎么定义一个注解和解析一 ...

  2. 在Android中使用枚举注解而不是枚举

    Enums often require more than twice as much memory as static constants. You should strictly avoid us ...

  3. android 中的一些资源注解,让编译器帮你检查代码

    android 中的一些资源注解,让编译器帮你检查代码 写方便的时候可以用注解来声明一些参数,以明确的指示参数的类型,让代码更安全.我们看到,在android源代码里大量使用了注解.我整理了一些注解如 ...

  4. Android中的自定义注解(反射实现-运行时注解)

    预备知识: Java注解基础 Java反射原理 Java动态代理 一.布局文件的注解 我们在Android开发的时候,总是会写到setContentView方法,为了避免每次都写重复的代码,我们需要使 ...

  5. 理解Android中的注解与反射

    反射 Java反射(Reflection)定义 Java反射机制是指在运行状态中 对于任意一个类,都能知道这个类的所有属性和方法:对于任何一个对象,都能够调用它的任何一个方法和属性: 这样动态获取新的 ...

  6. Android中使用ViewPager实现屏幕页面切换和页面切换效果

    之前关于如何实现屏幕页面切换,写过一篇博文<Android中使用ViewFlipper实现屏幕切换>,相比ViewFlipper,ViewPager更适用复杂的视图切换,而且Viewpag ...

  7. Android中Retrifit使用总结

    Android中网络请求框架Retrofit的使用注意事项 1.Retrofit是基于OkHttp网络请求框架的二次封装而已,懂Okhttp的小伙伴,那么Retrofit也就基本都会. 2.Retro ...

  8. Android中的Touch事件

    Android中的Touch事件处理 主要内容 Activity或View类的onTouchEvent()回调函数会接收到touch事件. 一个完整的手势是从ACTION_DOWN开始,到ACTION ...

  9. Android 进阶 Android 中的 IOC 框架 【ViewInject】 (下)

    上一篇博客我们已经带大家简单的吹了一下IoC,实现了Activity中View的布局以及控件的注入,如果你不了解,请参考:Android 进阶 教你打造 Android 中的 IOC 框架 [View ...

随机推荐

  1. 【Oracle】wmsys.wm_concat函数字段值为空

    这个是因为字符集的问题,和空值是没关系的.其实已经取到了数据,可以验证一下返回的不是0,但是由于这个里面有个chr(0)字符,而且可能第一个字符就是chr(0),所以就显示得怪异的空现象.至于为何会出 ...

  2. Xcode5 创建模板和UIView 关联XIB

    转自:http://www.cnblogs.com/china-ldw/p/3533896.html 在做ios应用开发的过程,难免遇到要创建 子view 和 自定义view的时候,归根到底,我们需要 ...

  3. 在树莓派上设置无线静态IP

    修改文件: /etc/network/interfaces,命令如下 sudo nano /etc/network/interfaces 将最后一句iface default inet dhcp,替换 ...

  4. Win7 x64安装Paramiko出问题

    今天上午windows下配置paramiko环境时出现问题,随手记录下来.   先说一下我的环境: win7 x64 旗舰版.Python3.5.0.pip8.1.0 pip install para ...

  5. SSH整合,"sessionFactory " or "hibernateTemplate " is required异常

    首先遇到的问题就是HibernateDaoSupport引起的,程序中所有的DAO都继承自HibernateDaoSupport,而HibernateDaoSupport需要注入sessionfact ...

  6. 网页制作之JavaScript部分3--事件及事件传输方式(函数调用 练习题 )重要---持续更新中

    一. 事件:说白了就是调用函数的一种方式.它包括:事件源.事件数据.事件处理程序. JS事件 1.js事件通常和函数结合来使用,这样可以通过发生的事件来驱动函数的执行,从而引起html出现不同的效果. ...

  7. TOMCAT的域名配置

    链接地址:http://blog.163.com/skk1987@126/blog/static/29303413201051383548377/ 现在很多的公司的网站都是用tomcat作为应用服务区 ...

  8. The Apache™ Batik Project

    Apache(tm) Batik SVG Toolkit - a Java-based toolkit for applications or applets that want to use ima ...

  9. NGUI 3.5教程(二)Label 标签 (Hello world)、多行文本

    写在前面:     本文将创建NGUI的第一个样例.依照编程传统,第一个样例,就是做一个Hello world 显示出来.NGUI.我们用Label来实现 . 欢迎大家纠错.拍砖!原创非常辛苦,如有转 ...

  10. VC实现URL编解码器

    //变化UTF8为了中国 void UTF8ToGB(CString& szstr) { WCHAR* strSrc; TCHAR* szRes; int i = MultiByteToWid ...