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

package im.weiyuan.com.viewutils;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast; public class MainActivity extends AppCompatActivity {
@ViewInject(R.id.tv_main_title)
private TextView tv_main_title;
private Button btn_main;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//这里一定要初始化注解
ViewUtils.inject(this);
} //login的参数必须是 View view
@OnClick(R.id.btn_main)
public void login(View view ){
Toast.makeText(MainActivity.this,"事件被点击了",Toast.LENGTH_LONG).show();
}
}
package im.weiyuan.com.viewutils;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; /**
* Created by wei.yuan on 2017/7/21.
*/
//指定注解的声明周期
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface OnClick {
int value();
}
package im.weiyuan.com.viewutils;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; /**
* Created by wei.yuan on 2017/7/21.
*/
//指定注解的声明周期
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface ViewInject{
int value(); //如果这里定义成id int id();用户在使用的时候必须写成 @ViewInject(id = R.id.tv_main_title),如果定义成int value();
// 用户访问可以写成@ViewInject(R.id.tv_main_title)
}
package im.weiyuan.com.viewutils;

import android.app.Activity;
import android.view.View; import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; /**
* Created by wei.yuan on 2017/7/21.
*/ public class ViewUtils {
public static void inject(Activity activity){
bindView(activity);
bindBtn(activity);
} /**
* 对按钮进行操作
* **/ private static void bindBtn(final Activity activity) {
Class clazz = activity.getClass(); /**
* 获得所有的方法
* */
Method[] methods = clazz.getDeclaredMethods(); /***
* 多所有的方法进行遍历
* */
for(final Method method:methods){
/**
* 看该方法上是否存在注解标签
* */
final OnClick annotation = method.getAnnotation(OnClick.class);
if(annotation != null){
/**
* 获得注解标签中的值 @OnClick(R.id.btn_main) ,这里的值就是 R.id.btn_main
* */
int resId = annotation.value(); /**
* 获得该对象
* */
final View btnView = activity.findViewById(resId); /**
* 给view 绑定点击监听事件
* */ btnView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
/**
* 在点击事件之后执行反射的回调方法
* 匿名内部类访问当前函数的局部变量,局部变量声明为final类型
* */
method.setAccessible(true);
try {
method.invoke(activity,btnView);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}); }
}
} private static void bindView(Activity activity){
//首先获得activity的所有字段,利用反射
Class clazz = activity.getClass();
//获得该字节码中的所有字段信息
Field[] fields = clazz.getDeclaredFields();
//对字段进行遍历,看给那些字段添加了注解的标签
for(Field field :fields){
ViewInject annotation = field.getAnnotation(ViewInject.class);
if(annotation != null){
/**
* 获得当中注解上的值
* */
int resId = annotation.value(); /**
* 通过activity 的findViewById获得当前的控件
* */
View view = activity.findViewById(resId); /**
* 通过反射将view的值设置给当前的字段
* */
field.setAccessible(true); /**
* 给activity的field字段赋值为view对象
* */ try {
field.set(activity,view);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
}
}

xml文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="im.weiyuan.com.viewutils.MainActivity"> <TextView
android:id="@+id/tv_main_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!" /> <Button
android:text="点击"
android:id="@+id/btn_main"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</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集合(八)哈希表及哈希函数的实现方式

    Java集合(八)哈希表及哈希函数的实现方式 一.哈希表 非哈希表的特点:关键字在表中的位置和它之间不存在一个确定的关系,查找的过程为给定值一次和各个关键字进行比较,查找的效率取决于和给定值进行比较的 ...

  2. PowerShell读写文件,行的去重

    Power Shell类似bash终端能够直接操作文件,使用其内置的Get-Content函数,配合一定的参数,能方便地读取文件和重定向. 1. Power Shell>>Get-Cont ...

  3. SpringBoot获取配置文件,就这么简单。

    在讲SpringBoot 获取配置文件之前我们需要对SpringBoot 的项目有一个整体的了解,如何创建SpringBoot 项目,项目结构等等知识点,我在这里就不一一讲述了,没有学过的小伙伴可以自 ...

  4. ThreadLocal Thread ThreadLocalMap 之间的关系

    ThreadLocal :每个线程通过此对象都会返回各自的值,互不干扰,这是因为每个线程都存着自己的一份副本.需要注意的是线程结束后,它所保存的所有副本都将进行垃圾回收(除非存在对这些副本的其他引用) ...

  5. Java实现 蓝桥杯 算法训练 猴子吃包子(暴力)

    试题 算法训练 猴子吃包子 问题描述 从前,有一只吃包子很厉害的猴子,它可以吃无数个包子,但是,它吃不同的包子速度也不同:肉包每秒钟吃x个:韭菜包每秒钟吃y个:没有馅的包子每秒钟吃z个:现在有x1个肉 ...

  6. Java实现 蓝桥杯VIP 算法训练 水仙花数

    这道题有两个方法,第一个就相对来说通俗易懂 第二个可以用到Java的一些方法 public class 水仙花数1 { public static void main(String[] args) { ...

  7. Java实现 蓝桥杯VIP 算法训练 接水问题

    题目描述 有n个人在一个水龙头前排队接水,假如每个人接水的时间为Ti,请编程找出这n个人排队的一种顺序,使得n个人的平均等待时间最小. 输入输出格式 输入格式: 输入文件共两行,第一行为n:第二行分别 ...

  8. Java实现 LeetCode 87 扰乱字符串

    87. 扰乱字符串 给定一个字符串 s1,我们可以把它递归地分割成两个非空子字符串,从而将其表示为二叉树. 下图是字符串 s1 = "great" 的一种可能的表示形式. grea ...

  9. java实现第六届蓝桥杯饮料换购

    饮料换购 饮料换购 乐羊羊饮料厂正在举办一次促销优惠活动.乐羊羊C型饮料,凭3个瓶盖可以再换一瓶C型饮料,并且可以一直循环下去,但不允许赊账. 请你计算一下,如果小明不浪费瓶盖,尽量地参加活动,那么, ...

  10. Redis企业级数据备份与恢复方案

    一.持久化配置 RBD和AOF建议同时打开(Redis4.0之后支持) RDB做冷备,AOF做数据恢复(数据更可靠) RDB采取默认配置即可,AOF推荐采取everysec每秒策略 AOF和RDB还不 ...