注解在android中的使用
注解在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中的使用的更多相关文章
- Android中通过注解代替findViewById方法
转自:http://www.2cto.com/kf/201405/302998.html 这篇文章主要讲解注解实现findViewById的功能,首先我们来熟悉一下在java中怎么定义一个注解和解析一 ...
- 在Android中使用枚举注解而不是枚举
Enums often require more than twice as much memory as static constants. You should strictly avoid us ...
- android 中的一些资源注解,让编译器帮你检查代码
android 中的一些资源注解,让编译器帮你检查代码 写方便的时候可以用注解来声明一些参数,以明确的指示参数的类型,让代码更安全.我们看到,在android源代码里大量使用了注解.我整理了一些注解如 ...
- Android中的自定义注解(反射实现-运行时注解)
预备知识: Java注解基础 Java反射原理 Java动态代理 一.布局文件的注解 我们在Android开发的时候,总是会写到setContentView方法,为了避免每次都写重复的代码,我们需要使 ...
- 理解Android中的注解与反射
反射 Java反射(Reflection)定义 Java反射机制是指在运行状态中 对于任意一个类,都能知道这个类的所有属性和方法:对于任何一个对象,都能够调用它的任何一个方法和属性: 这样动态获取新的 ...
- Android中使用ViewPager实现屏幕页面切换和页面切换效果
之前关于如何实现屏幕页面切换,写过一篇博文<Android中使用ViewFlipper实现屏幕切换>,相比ViewFlipper,ViewPager更适用复杂的视图切换,而且Viewpag ...
- Android中Retrifit使用总结
Android中网络请求框架Retrofit的使用注意事项 1.Retrofit是基于OkHttp网络请求框架的二次封装而已,懂Okhttp的小伙伴,那么Retrofit也就基本都会. 2.Retro ...
- Android中的Touch事件
Android中的Touch事件处理 主要内容 Activity或View类的onTouchEvent()回调函数会接收到touch事件. 一个完整的手势是从ACTION_DOWN开始,到ACTION ...
- Android 进阶 Android 中的 IOC 框架 【ViewInject】 (下)
上一篇博客我们已经带大家简单的吹了一下IoC,实现了Activity中View的布局以及控件的注入,如果你不了解,请参考:Android 进阶 教你打造 Android 中的 IOC 框架 [View ...
随机推荐
- 【Oracle】wmsys.wm_concat函数字段值为空
这个是因为字符集的问题,和空值是没关系的.其实已经取到了数据,可以验证一下返回的不是0,但是由于这个里面有个chr(0)字符,而且可能第一个字符就是chr(0),所以就显示得怪异的空现象.至于为何会出 ...
- Xcode5 创建模板和UIView 关联XIB
转自:http://www.cnblogs.com/china-ldw/p/3533896.html 在做ios应用开发的过程,难免遇到要创建 子view 和 自定义view的时候,归根到底,我们需要 ...
- 在树莓派上设置无线静态IP
修改文件: /etc/network/interfaces,命令如下 sudo nano /etc/network/interfaces 将最后一句iface default inet dhcp,替换 ...
- Win7 x64安装Paramiko出问题
今天上午windows下配置paramiko环境时出现问题,随手记录下来. 先说一下我的环境: win7 x64 旗舰版.Python3.5.0.pip8.1.0 pip install para ...
- SSH整合,"sessionFactory " or "hibernateTemplate " is required异常
首先遇到的问题就是HibernateDaoSupport引起的,程序中所有的DAO都继承自HibernateDaoSupport,而HibernateDaoSupport需要注入sessionfact ...
- 网页制作之JavaScript部分3--事件及事件传输方式(函数调用 练习题 )重要---持续更新中
一. 事件:说白了就是调用函数的一种方式.它包括:事件源.事件数据.事件处理程序. JS事件 1.js事件通常和函数结合来使用,这样可以通过发生的事件来驱动函数的执行,从而引起html出现不同的效果. ...
- TOMCAT的域名配置
链接地址:http://blog.163.com/skk1987@126/blog/static/29303413201051383548377/ 现在很多的公司的网站都是用tomcat作为应用服务区 ...
- The Apache™ Batik Project
Apache(tm) Batik SVG Toolkit - a Java-based toolkit for applications or applets that want to use ima ...
- NGUI 3.5教程(二)Label 标签 (Hello world)、多行文本
写在前面: 本文将创建NGUI的第一个样例.依照编程传统,第一个样例,就是做一个Hello world 显示出来.NGUI.我们用Label来实现 . 欢迎大家纠错.拍砖!原创非常辛苦,如有转 ...
- VC实现URL编解码器
//变化UTF8为了中国 void UTF8ToGB(CString& szstr) { WCHAR* strSrc; TCHAR* szRes; int i = MultiByteToWid ...