IOC注解框架

IOC注解框架

  1. Butter Knife
  2. ViewUtils(Xutils)
02-ViewUtils的实现
  1. MainActivity.java

public class MainActivity extends Activity {
  private String name;
  @ViewInject(R.id.tv1)
  private TextView tv1;
  //因为在ViewInject注解中的变量为value,则注解中可以省略value值
  @ViewInject(R.id.tv2)
  private TextView tv2;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ViewUtils.inject(this);
  }
  @Deprecated
  @OnClick(R.id.btn1)
  public void clickXXX(View view){
    Log.d("tag", "tv1="+tv1+"\ntv2="+tv2);

    Toast.makeText(this, "我被点击了", Toast.LENGTH_SHORT).show();
  }
}
  1. ViewInject.java

//便是该注解是属性值
@Target(ElementType.FIELD)
//表示啊该注解在内存中也生效
@Retention(RetentionPolicy.RUNTIME)
public @interface ViewInject {
  public int value();
}
  1. 按钮点击注解OnClick.java

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface OnClick {
  public int value();
}
  1. ViewUtils.java

public class ViewUtils {
  public static void inject(Activity activity) {
    bindView(activity);// 绑定控件
    bindOnClick(activity);// 绑定点击事件
  }

  private static void bindView(Activity activity) {
     // 1. 获取字节码
    Class clazz = activity.getClass();
     // 2. 获取所有的字段
    Field[] declaredFields = clazz.getDeclaredFields();
    // 3. 遍历字段,只过滤出添加了@ViewInject的字段
    for (Field field : declaredFields) {
      // 4. 获取到字段之后,获取字段的注解对象
      ViewInject viewInject = field.getAnnotation(ViewInject.class);
      // 如果该字段上有注解就代表这个字段就是用户想绑定View的
      if (viewInject != null) {
        // 5. 获取自定义注解上面的id
        int resId = viewInject.value();
        // 6.通过 View view = Activity.findViewByid(id)
        View view = activity.findViewById(resId);
        // 7. 通过暴力反射将view设置该当前字段
        field.setAccessible(true);
        try {
          field.set(activity, view);
        } catch (Exception e) {
          e.printStackTrace();
        }
      }
    }
  }
  private static void bindOnClick(final Activity activity) {
    //1. 获取字节码
    Class clazz = activity.getClass();
    //2. 获取所有的Method
    Method[] declaredMethods = clazz.getDeclaredMethods();
     //3. 遍历方法,只找有自定义注解的方法
    for (final Method method : declaredMethods) {
       //4. 获取当前Method上面的注解
      OnClick onClick = method.getAnnotation(OnClick.class);
      if (onClick != null) {
         //5. 获取到注解上的id
        int resId = onClick.value();
        //6. 通过 View btn = Activity.findViewByid(id)
        final View view = activity.findViewById(resId);
        /*
         * 7. 给btn绑定点击监听事件 btn.setOnClickListener(new OnClickListener(){
         * public void onClick(View view){ 8. 通过暴力反射调用当前遍历到的Method } });
         */
        view.setOnClickListener(new OnClickListener() {
          @Override
          public void onClick(View v) {
            // 8. 通过暴力反射调用当前遍历到的Method
            method.setAccessible(true);
            try {
             method.invoke(activity, view);
            } catch (Exception e) {
             e.printStackTrace();
            }
          }
        });
      }
    }
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值