一  xutils框架引入到AndroidStudio工程,最简单的方法:
① 在APP的build.gradle里面加入 compile 'org.xutils:xutils:3.3.36'。
② 一定要自定义一个application.class
在自定义的application里的onCreate方法里面初始化xutils:

x.Ext.init(this);//初始化XUtils
x.Ext.setDebug(BuildConfig.DEBUG);//是否输出debug日志

③ 在manifest文件里面加入自己的application

 
<application
android:name=".application.GlobalApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
 

④ 加入权限 
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

其他的方法比如引入jar包引入lib自行百度。

二 xutils框架的注解
注解框架很好用,直接在activity或者fragment里面加入
@ViewInject(R.id.xxx)
private TextView mTvText;
注意,注解的时候一定要在onCreate之前,像声明属性和变量一样。然后偶就好奇注解框架是怎么完成了用viewInject去完成findViewById这个操作的。就顺便了解了一下注解是怎么一回事。

  2.1 注解机制  其实就是java的反射实现的,我不在这里掉书袋解释反射是啥,自行百度。下面就自己实现了一下用反射实现findViewById
  ① 新建一个@annotation类型的class ,如图 ,

我们看到ViewInject的创建和接口差不多,但是别忘了前面的@和前面的声明@Target和@Retention

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ViewInject {
int id () default -1;//控件ID,在某一个控件上面使用注解标注其ID
}

然后就是反射类InjectView的创建。类里面只有一个方法injectView(Activity activity)

 
public class InjectView {
public static void injectView(Activity activity) {
try {
Class clazz = activity.getClass();
Field[] fields = clazz.getDeclaredFields();//得到传入的activity的所有字段
for(Field field:fields){
if(field.isAnnotationPresent(ViewInject.class)){
ViewInject inject = field.getAnnotation(ViewInject.class);
int id = inject.id();
if(id > 0 ){
field.setAccessible(true);
field.set(activity,activity.findViewById(id));
} }
}
}catch (IllegalAccessException e){
e.printStackTrace();
}catch (IllegalArgumentException e){
e.printStackTrace();
} }
}
 

然后再在我的activity中使用我自己定义的注解

 
public class MainActivity extends AppCompatActivity {

    @ViewInject(id = R.id.tv_text)
private TextView mTvText; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
InjectView.injectView(this);
mTvText.setText("ssssss");
}
}
 

可以看到我先注解声明我的TextView,完成注解声明后再利用InjectView.injectView(this),来完成整个注解。类里面用到了一个Field的类,就又好奇这个是干啥的(好奇宝宝),在刚接触java的时候书上看到过Field就是对象的属性,当时觉得就这么回事吧,但素,后面学习的时候又见过几回,那时候没怎么去真正的去深入了解,只知道跟反射有点关系,在网络编程和数据库挂钩的一些代码编写里面出现的频率太大!!!当时正年少轻狂,什么都是只是浅尝辄止。如今追悔莫及!!扼腕长叹!!!不废话了,接下来熟悉Field

  2.2 Field类的学习

  在查看了一些文档并自己写了一个测试类之后,才明白,Field说白了其实就是类的属性,是啊说的很在理(书上说的是没错的所以不能说书糊弄了你我)。通过它可以得到一个类的所有属性的类型,父类型以及属性值等等。

下面就是我写的那个测试类:首先写一个Student的实体

 
package bean;

import java.util.Date;

public class Students {

    private String name ;
private String address;
private long id;
private Date birthday;
public String nickName; @Override
public String toString() {
return "Students [name=" + name + ", address=" + address + ", id=" + id
+ ", birthday=" + birthday + ", nickName=" + nickName + "]";
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getNickName() {
return nickName;
}
public void setNickName(String nickName) {
this.nickName = nickName;
} }
 

然后就是针对这个实体进行Field的测试

 
package main;

import java.lang.reflect.Field;
import java.util.Date; import bean.Students; public class TestField { public static void main(String[] args) {
Students student = new Students();
student.setName("John");
student.setNickName("pumpKing");
student.setBirthday(new Date());
student.setId(3501197405300359L); try {
Field property1 = student.getClass().getDeclaredField("name");
Field property2 = student.getClass().getField("nickName");
Field property3 = student.getClass().getDeclaredField("birthday");
System.err.println(property1);
System.err.println(property2);
System.err.println(property3);
System.out.println("the superClass of Student is: "+student.getClass().getSuperclass());
System.out.println("the superClass of String is: "+property1.getClass().getSuperclass());
System.out.println("the superClass of Date is: "+property3.getClass().getSuperclass());
System.out.println("the classLoader of student is: "+student.getClass().getClassLoader().getClass().getName());
Field[] fields = student.getClass().getDeclaredFields();
for(Field field : fields){
field.setAccessible(true);
System.out.println(field.get(student));
System.out.println(field);
}
System.out.println("origin = "+student.toString());
property2.set(student, "egg");//利用反射操作类的属性
System.out.println("then = "+student.toString());
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
 

下面是测试的结果

 
private java.lang.String bean.Students.name
public java.lang.String bean.Students.nickName
private java.util.Date bean.Students.birthday
the superClass of Student is: class java.lang.Object
the superClass of String is: class java.lang.reflect.AccessibleObject
the superClass of Date is: class java.lang.reflect.AccessibleObject
the classLoader of student is: sun.misc.Launcher$AppClassLoader
John
private java.lang.String bean.Students.name
null
private java.lang.String bean.Students.address
3501197405300359
private long bean.Students.id
Tue Jun 14 14:45:45 CST 2016
private java.util.Date bean.Students.birthday
pumpKing
public java.lang.String bean.Students.nickName
origin = Students [name=John, address=null, id=3501197405300359, birthday=Tue Jun 14 14:45:45 CST 2016, nickName=pumpKing]
then = Students [name=John, address=null, id=3501197405300359, birthday=Tue Jun 14 14:45:45 CST 2016, nickName=egg]
 

okay,XUTils的注解就说到这里,毕竟这并不是它的重头戏。

XUtils框架的学习(一)的更多相关文章

  1. xUTils框架的学习(二)

    这章讲的是框架的DbUtils模块的学习 三 xUtils框架的DButils模块 最开始接触这个框架就是从数据库模块开始的.当时的需求是需要记录用户的登录数据,保存在本地以便进行离线登录.首先想到的 ...

  2. XUTils框架的学习(三)

    前面两章说了xutils框架的引入和注解模块的使用和数据库模块的使用,想了解的朋友可以去看看. 前面在说数据库模块的操作的时候是手动创建数据库并保存在asset文件夹里面,再通过I/O将数据库写进应用 ...

  3. Android Xutils框架HttpUtil Get请求缓存问题

    话说,今天和服务器开发人员小小的逗逼了一下,为啥呢? 话说今天有个"收藏产品"的请求接口,是get request的哦,我客户端写好接口后,点击"收藏按钮",返 ...

  4. xUtils框架的使用

    xUtils简介 xUtils 包含了很多实用的android工具,xUtils 源于Afinal框架,对Afinal进行了大量重构,使得xUtils支持大文件上传,更全面的http请求协议支持,拥有 ...

  5. Android Xutils 框架(转)

    Android Xutils 框架 (转) 目录(?)[-] xUtils简介 目前xUtils主要有四大模块 使用xUtils快速开发框架需要有以下权限 混淆时注意事项 DbUtils使用方法 Vi ...

  6. (转) 基于Theano的深度学习(Deep Learning)框架Keras学习随笔-01-FAQ

    特别棒的一篇文章,仍不住转一下,留着以后需要时阅读 基于Theano的深度学习(Deep Learning)框架Keras学习随笔-01-FAQ

  7. jfinal框架教程-学习笔记

    jfinal框架教程-学习笔记 JFinal  是基于 Java  语言的极速  WEB  + ORM  开发框架,其核心设计目标是开发迅速.代码量少.学习简单.功能强大.轻量级.易扩展.Restfu ...

  8. Android使用XUtils框架上传照片(一张或多张)和文本,server接收照片和文字(无乱码)

    Android上传图片,这里我使用了如今比較流行的XUtils框架.该框架能够实现文件上传.文件下载.图片缓存等等,有待研究. 以下是Android端上传的代码: xUtils.jar下载 Strin ...

  9. 【STM32H7教程】第12章 STM32H7的HAL库框架设计学习

    完整教程下载地址:http://forum.armfly.com/forum.php?mod=viewthread&tid=86980 第12章       STM32H7的HAL库框架设计学 ...

随机推荐

  1. C中浮点数转字符串

    求浮点数转换成字符串,如何才能获得比较正确的字符串.用printf("%f\n", (float)5); 这种方式转换出来的结果是 5.000000 ,末尾都会带6位小数. 控制精 ...

  2. Swift与Objective-C的对比

    WWDC 2014上苹果再次惊世骇俗的推出了新的编程语言Swift 雨燕, 这个消息会前没有半点风声的走漏.消息发布当时,会场一片惊呼,相信全球看直播的码农们当时也感觉脑袋被敲了一记闷棍吧.于是熬夜学 ...

  3. MYSQL系列1_MySQL的安装,可视化工具的使用,以及建库建表等

    大家都知道MYSQL是开源的数据库,现在MYSQL在企业中的使用也越来越多,本人之前用过SQL SERVER数据库,因业务需要和自己的兴趣想要学习MYSQL,对于MYSQL,本人还是新手,请大家多多指 ...

  4. 在TNSNAMES.ORA文件中配置本机装的oracle

    首先,感谢这两位网友:http://zhidao.baidu.com/link?url=eGYeoEa-EhQdVitSGqjE36uNfVmEsryXH1WUjPue6YvArDSx-Y1N9_rd ...

  5. BZOJ 4123 [Baltic2015] Hacker 解题报告

    首先,Alice 会选择一个长度为 $\lfloor\frac{n+1}{2}\rfloor$ 的区间,我们把这个长度记为 $len$. 有这么一个结论:令 $F_i$ 为覆盖 $i$ 点的所有长度为 ...

  6. C#跳出循环的几种方法的区别

    break是循环结束执行,执行循环体后面的代码. continue是跳过本次循环未执行的代码,继续执行下一次循环. goto是跳到指定的指令去,你指哪,他跳到哪. return是函数返回,如果循环在M ...

  7. Eclipse 调整代码颜色的地方

    Editors - Text Editors General-Apperance-Colors and Fonts 各工作区里面的Editor和Syntax Coloring

  8. POJ3258River Hopscotch(二分)

    http://poj.org/problem?id=3258 题意:有一条很长很直的河距离为L,里边有n块石头,不包括起点和终点的那两块石头,奶牛们会从一个石头跳到另外一个,但因为有的石头隔得太近了, ...

  9. 实例讲解Nginx下的rewrite规则

    一.正则表达式匹配,其中:* ~ 为区分大小写匹配* ~* 为不区分大小写匹配* !~和!~*分别为区分大小写不匹配及不区分大小写不匹配二.文件及目录匹配,其中:* -f和!-f用来判断是否存在文件* ...

  10. (原创)CityEngine 2014和ArcGIS 10.3冲突问题的解决

      先卸载ArcGIS License Manager 10.3 安装ArcGIS License Manager 10.2.2 用keygen算出ArcGIS 10.3的许可,似乎本许可在ArcGI ...