在前面学习的基础上,我们自己编写一个ViewUtils注解框架类,不清楚的原理看前面的源代码

  1. package im.weiyuan.com.viewutils;
  2.  
  3. import android.support.v7.app.AppCompatActivity;
  4. import android.os.Bundle;
  5. import android.view.View;
  6. import android.widget.Button;
  7. import android.widget.TextView;
  8. import android.widget.Toast;
  9.  
  10. public class MainActivity extends AppCompatActivity {
  11. @ViewInject(R.id.tv_main_title)
  12. private TextView tv_main_title;
  13. private Button btn_main;
  14. @Override
  15. protected void onCreate(Bundle savedInstanceState) {
  16. super.onCreate(savedInstanceState);
  17. setContentView(R.layout.activity_main);
  18. //这里一定要初始化注解
  19. ViewUtils.inject(this);
  20. }
  21.  
  22. //login的参数必须是 View view
  23. @OnClick(R.id.btn_main)
  24. public void login(View view ){
  25. Toast.makeText(MainActivity.this,"事件被点击了",Toast.LENGTH_LONG).show();
  26. }
  27. }
  1. package im.weiyuan.com.viewutils;
  2.  
  3. import java.lang.annotation.ElementType;
  4. import java.lang.annotation.Retention;
  5. import java.lang.annotation.RetentionPolicy;
  6. import java.lang.annotation.Target;
  7.  
  8. /**
  9. * Created by wei.yuan on 2017/7/21.
  10. */
  11. //指定注解的声明周期
  12. @Retention(RetentionPolicy.RUNTIME)
  13. @Target(ElementType.METHOD)
  14. public @interface OnClick {
  15. int value();
  16. }
  1. package im.weiyuan.com.viewutils;
  2.  
  3. import java.lang.annotation.ElementType;
  4. import java.lang.annotation.Retention;
  5. import java.lang.annotation.RetentionPolicy;
  6. import java.lang.annotation.Target;
  7.  
  8. /**
  9. * Created by wei.yuan on 2017/7/21.
  10. */
  11. //指定注解的声明周期
  12. @Retention(RetentionPolicy.RUNTIME)
  13. @Target(ElementType.FIELD)
  14. public @interface ViewInject{
  15. int value(); //如果这里定义成id int id();用户在使用的时候必须写成 @ViewInject(id = R.id.tv_main_title),如果定义成int value();
  16. // 用户访问可以写成@ViewInject(R.id.tv_main_title)
  17. }
  1. package im.weiyuan.com.viewutils;
  2.  
  3. import android.app.Activity;
  4. import android.view.View;
  5.  
  6. import java.lang.reflect.Field;
  7. import java.lang.reflect.InvocationTargetException;
  8. import java.lang.reflect.Method;
  9.  
  10. /**
  11. * Created by wei.yuan on 2017/7/21.
  12. */
  13.  
  14. public class ViewUtils {
  15. public static void inject(Activity activity){
  16. bindView(activity);
  17. bindBtn(activity);
  18. }
  19.  
  20. /**
  21. * 对按钮进行操作
  22. * **/
  23.  
  24. private static void bindBtn(final Activity activity) {
  25. Class clazz = activity.getClass();
  26.  
  27. /**
  28. * 获得所有的方法
  29. * */
  30. Method[] methods = clazz.getDeclaredMethods();
  31.  
  32. /***
  33. * 多所有的方法进行遍历
  34. * */
  35. for(final Method method:methods){
  36. /**
  37. * 看该方法上是否存在注解标签
  38. * */
  39. final OnClick annotation = method.getAnnotation(OnClick.class);
  40. if(annotation != null){
  41. /**
  42. * 获得注解标签中的值 @OnClick(R.id.btn_main) ,这里的值就是 R.id.btn_main
  43. * */
  44. int resId = annotation.value();
  45.  
  46. /**
  47. * 获得该对象
  48. * */
  49. final View btnView = activity.findViewById(resId);
  50.  
  51. /**
  52. * 给view 绑定点击监听事件
  53. * */
  54.  
  55. btnView.setOnClickListener(new View.OnClickListener() {
  56. @Override
  57. public void onClick(View v) {
  58. /**
  59. * 在点击事件之后执行反射的回调方法
  60. * 匿名内部类访问当前函数的局部变量,局部变量声明为final类型
  61. * */
  62. method.setAccessible(true);
  63. try {
  64. method.invoke(activity,btnView);
  65. } catch (IllegalAccessException e) {
  66. e.printStackTrace();
  67. } catch (InvocationTargetException e) {
  68. e.printStackTrace();
  69. }
  70. }
  71. });
  72.  
  73. }
  74. }
  75. }
  76.  
  77. private static void bindView(Activity activity){
  78. //首先获得activity的所有字段,利用反射
  79. Class clazz = activity.getClass();
  80. //获得该字节码中的所有字段信息
  81. Field[] fields = clazz.getDeclaredFields();
  82. //对字段进行遍历,看给那些字段添加了注解的标签
  83. for(Field field :fields){
  84. ViewInject annotation = field.getAnnotation(ViewInject.class);
  85. if(annotation != null){
  86. /**
  87. * 获得当中注解上的值
  88. * */
  89. int resId = annotation.value();
  90.  
  91. /**
  92. * 通过activity 的findViewById获得当前的控件
  93. * */
  94. View view = activity.findViewById(resId);
  95.  
  96. /**
  97. * 通过反射将view的值设置给当前的字段
  98. * */
  99. field.setAccessible(true);
  100.  
  101. /**
  102. * 给activity的field字段赋值为view对象
  103. * */
  104.  
  105. try {
  106. field.set(activity,view);
  107. } catch (IllegalAccessException e) {
  108. e.printStackTrace();
  109. }
  110. }
  111. }
  112. }
  113. }

xml文件:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:tools="http://schemas.android.com/tools"
  4. android:id="@+id/activity_main"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent"
  7. android:orientation="vertical"
  8. tools:context="im.weiyuan.com.viewutils.MainActivity">
  9.  
  10. <TextView
  11. android:id="@+id/tv_main_title"
  12. android:layout_width="wrap_content"
  13. android:layout_height="wrap_content"
  14. android:text="Hello World!" />
  15.  
  16. <Button
  17. android:text="点击"
  18. android:id="@+id/btn_main"
  19. android:layout_width="wrap_content"
  20. android:layout_height="wrap_content" />
  21. </LinearLayout>

相当的经典

java 中的 自定义viewUtils框架的更多相关文章

  1. [转]Java中实现自定义的注解处理器

    Java中实现自定义的注解处理器(Annotation Processor) 置顶2016年07月25日 19:42:49 阅读数:9877 在之前的<简单实现ButterKnife的注解功能& ...

  2. java 中的fork join框架

    文章目录 ForkJoinPool ForkJoinWorkerThread ForkJoinTask 在ForkJoinPool中提交Task java 中的fork join框架 fork joi ...

  3. Java中的自定义数组队列

    在Java中,作为所有数据结构中存储和获取速度最快的一种,数组凭借其这种简单易用的优势在各个方面都能大显神威.但是数组也有自身的局限性.数组的长度必须是固定的一旦定义之后就无法动态的更改,这就会造成这 ...

  4. Java中泛型在集合框架中的应用

    泛型是Java中的一个重要概念,上一篇文章我们说过,当元素存入集合时,集合会将元素转换为Object类型存储,当取出时也是按照Object取出的,所以用get方法取出时,我们会进行强制类型转换,并且通 ...

  5. JAVA中的Fork/Join框架

    看了下Java Tutorials中的fork/join章节,整理下. 什么是fork/join框架 fork/join框架是ExecutorService接口的一个实现,可以帮助开发人员充分利用多核 ...

  6. java中的类集框架

    1.什么是类集框架 1.是一组类和接口 2.位于java.util包当中 3.主要用于用户存储和管理对象 4.主要分为三大类——集合.列表和映射 2.类集框架图 虚线框的表示接口,实线框的表示实现类 ...

  7. Java中常见的集合框架

    1. 一.collection (有序)接口的实现的接口 set  list 其中set接口的实现类是HashSet,List接口的实现类是ArrayList.LinkList.Vector 二.Ma ...

  8. Java中的自定义注解

    ## 元注解 要声明一个注解, 我们需要元注解, 元注解是指注解的注解,包括@Retention, @Target, @Document, @Inherited. @Retention 注解的保留位置 ...

  9. java中异常这种技术框架是怎么工作的?

    异常这种技术框架是怎么工作的?马克-to-win:注意是运行程序时,而不是编译时,当一个非正常情况出现,比如除0,就叫异常情况.马克-to- win:为了能优雅的处理异常情况(在出现异常情况后,程序不 ...

随机推荐

  1. java类的方法的使用

    类的方法:提供某种功能的实现: 实例:public void eat (){ } public String  getName(){ } public void  setName(String n){ ...

  2. apt-key 密钥管理,apt-secure 原理 验证链 验证测试

    apt-key 用于管理Debian Linux系统中的软件包密钥.每个发布的deb包,都是通过密钥认证的,apt-key用来管理密钥. apt-key list 列出已保存在系统中key.包括 /e ...

  3. 点击label时text输入框被选中

    当点击label标签时,能够选中与其对应的输入框,有2种方式,采用第一种时会产生太多的id,推荐第二种. <form action="03.php"> <labe ...

  4. Java实现 蓝桥杯VIP 算法训练 拦截导弹

    1260:[例9.4]拦截导弹(Noip1999) 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 4063 通过数: 1477 [题目描述] 某国为了防御敌国的导弹袭击,发展出一 ...

  5. Java实现 LeetCode 118 杨辉三角

    118. 杨辉三角 给定一个非负整数 numRows,生成杨辉三角的前 numRows 行. 在杨辉三角中,每个数是它左上方和右上方的数的和. 示例: 输入: 5 输出: [ [1], [1,1], ...

  6. java实现第五届蓝桥杯生物芯片

    生物芯片 X博士正在研究一种生物芯片,其逻辑密集度.容量都远远高于普通的半导体芯片. 博士在芯片中设计了 n 个微型光源,每个光源操作一次就会改变其状态,即:点亮转为关闭,或关闭转为点亮. 这些光源的 ...

  7. CDN HTTPS安全加速基本概念、解决方案及优化实践

    大家都知道,HTTP 本身是明文传输的,没有经过任何安全处理,网站HTTPS解决方案通过在HTTP协议之上引入证书服务,完美解决网站的安全问题.本文将为大家介绍阿里云CDN HTTPS安全加速传输的基 ...

  8. Java Review (一、Java开发环境)

    @ 目录 Java程序运行机制 高级语言运行机制 编译型语言 解释型语言 Java运行机制和JVM 编写 编译 运行 Java开发工具包 JDK JRE JDK.JRE与JVM HelloWord 编 ...

  9. iOS -实现UIView圆角显示的方法

    添加一个UIView时,默认直角显示有时对于有强迫症的患者还真有点不舒服! eg: 怎么实现UIview的圆角显示呢? 首先包含一个头文件: #import <QuartzCore/Quartz ...

  10. hadoop知识整理(4)之zookeeper

    一.介绍 一个分布式协调服务框架: 一个精简的文件系统,每个节点大小最好不大于1MB: 众多hadoop组件依赖于此,比如hdfs,kafka,hbase,storm等: 旨在,分布式应用中,提供一个 ...