ViewInject原理

来源:互联网 发布:e63诺基亚软件下载网址 编辑:程序博客网 时间:2024/06/16 21:09

 

import java.lang.reflect.Field;
import java.lang.reflect.Method;

import android.app.Activity;
import android.view.View;

/***
 * 注解管理器
 * @author Administrator
 *
 */
public class ViewInjectUtils
{
 private static final String METHOD_SET_CONTENTVIEW = "setContentView";
 private static final String METHOD_FIND_VIEW_BY_ID = "findViewById";

 /**
  *Activity中使用
  * **/
 public static void inject(Activity activity)
 {
  injectContentView(activity);
  injectViews(activity,null);
  injectOnclickView(activity,null);
 }

 /**
  * 注释
  * @param parent 带有注解的类
  * @param view 所在的View
  */
 public static void inject(Object parent,View view)
 {
  injectViews(parent,view);
  injectOnclickView(parent,view);
 }

 /**
  * 注入所有的控件
  *
  * @param view
  */
 private static void injectViews(Object view,Object targetView)
 {
  Class clazz = view.getClass();
  Field[] fields = clazz.getDeclaredFields();
  // 遍历所有成员变量
  for (Field field : fields)
  {
   ViewInject viewInjectAnnotation = field
     .getAnnotation(ViewInject.class);
   if (viewInjectAnnotation != null)
   {
    int viewId = viewInjectAnnotation.value();
    if (viewId != -1)
    {
     // 初始化View
     try
     {
      Method method = null;
      Object resView = null;
      if(targetView != null)
      {
       method = targetView.getClass().getMethod(METHOD_FIND_VIEW_BY_ID,
         int.class);
       resView = method.invoke(targetView, viewId);
      }
      else
      {
       method = clazz.getMethod(METHOD_FIND_VIEW_BY_ID,
         int.class);
       resView = method.invoke(view, viewId);
      }
      
      if(resView == null)
      {
       continue;
      }
      field.setAccessible(true);
      field.set(view, resView);
     } catch (Exception e)
     {
      e.printStackTrace();
     }

    }
   }

  }

 }

 /**
  * 注入主布局文件
  *
  * @param activity
  */
 private static void injectContentView(Activity activity)
 {
  Class<? extends Activity> clazz = activity.getClass();
  // 查询类上是否存在ContentView注解
  ContentView contentView = clazz.getAnnotation(ContentView.class);
  if (contentView != null)// 存在
  {
   int contentViewLayoutId = contentView.value();
   try
   {
    Method method = clazz.getMethod(METHOD_SET_CONTENTVIEW,
      int.class);
    method.setAccessible(true);
    method.invoke(activity, contentViewLayoutId);
   } catch (Exception e)
   {
    e.printStackTrace();
   }
  }
 }
 
 private static void injectOnclickView(Object view,Object targetView)
 {
  Class clazz = view.getClass();
  Method[] ms = clazz.getMethods();
  for(Method m:ms)
  {
   ViewOnClick viewClick = m.getAnnotation(ViewOnClick.class);
    if(viewClick != null)
    {
     try
     {
      int[] ids = viewClick.value();
            for (int id : ids) {
             
             Method method = null;
       Object obj = null;
       if(targetView != null)
       {
        method = targetView.getClass().getMethod(METHOD_FIND_VIEW_BY_ID,
          int.class);
        obj = method.invoke(targetView, id);
       }
       else
       {
        method = clazz.getMethod(METHOD_FIND_VIEW_BY_ID,
          int.class);
        obj = method.invoke(view, id);
       }
                if (null == obj) {
                    continue;
                }
                if(!View.class.isAssignableFrom(obj.getClass())){
                 continue;
                }
                ((View) obj).setOnClickListener(new EventListener(view).click(m.getName()));
            }
     }
     catch(Exception e)
     {
      e.printStackTrace();
     }
    
    }
  }
       
 }
}

 

 

 

 

 

 

 

 

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 查找View 相当于findviewbyid
 * @author Administrator
 *
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ViewInject
{
 int value();
}

 

0 0
原创粉丝点击