示例代码

@ViewId(R.id.button)private Button button;@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);     setContentView(R.layout.activity_main);    ViewUtils.inject(this);    button.setText( "123" );}@OnClick({R.id.button})private void aaaaaaa( View view ) {    Toast.makeText( this, "tttttttt", Toast.LENGTH_SHORT).show();}@OnClick(R.id.imageView)private void ttttttt() {    Toast.makeText( this, "ddddddddddd", Toast.LENGTH_SHORT).show();}

ViewUtils

public class ViewUtils {public static void inject(Activity activity) {    inject(new ViewFinder(activity), activity);}public static void inject(View view) {    inject(new ViewFinder(view), view);}public static void inject(View view, Object object) {    inject(new ViewFinder(view), object);}public static void inject( ViewFinder viewFinder, Object object ) {    injectFiled(viewFinder,object);    injectEvent(viewFinder,object);}private static void injectFiled(ViewFinder viewFinder, Object object) {    Class<?> clazz = object.getClass();    // 所有变量    Field[] fields = clazz.getDeclaredFields();    for (Field field : fields) {        // 注解类型        ViewId viewById = field.getAnnotation(ViewId.class);        // 注解不存在        if( viewById == null ) continue;        // 注解的值,ViewID        int viewId = viewById.value();        // 查找,获取View        View view = viewFinder.findViewById(viewId);        if( view == null ) continue;        try {            //  能够注入所有修饰符            field.setAccessible( true );            field.set(object,view);        } catch (IllegalAccessException e) {            e.printStackTrace();        }    }}private static void injectEvent(ViewFinder viewFinder, Object object) {    Class<?> clazz = object.getClass();    // 所有变量    Method[] methods = clazz.getDeclaredMethods();    for (Method method : methods) {        OnClick onClick = method.getAnnotation(OnClick.class);        if( onClick == null ) continue;        int[] value = onClick.value();        if( value.length == 0 ) continue;        for (int viewId : value) {            View view = viewFinder.findViewById(viewId);            if( view == null ) continue;            view.setOnClickListener( new DeclaredOnClickListener( view, object , method) );        }    }}private static class DeclaredOnClickListener implements View.OnClickListener {    private View clickView;    private Object clickObject;    private Method clickMethod;    public DeclaredOnClickListener( View view, Object object, Method method ) {        this.clickView = view;        this.clickObject = object;        this.clickMethod = method;    }    @Override    public void onClick(View v) {        try {            clickMethod.setAccessible(true);            clickMethod.invoke( clickObject, clickView );        } catch (Exception e) {            try {                clickMethod.invoke( clickObject );            } catch (Exception e1) {                e1.printStackTrace();            }        }    }}}

ViewFInder

public class ViewFinder {  private Activity mActivity;  private View mView;  private byte viewType;  public ViewFinder(View view) {      this.mView = view;      viewType = 0;  }  public ViewFinder(Activity activity) {      this.mActivity = activity;      viewType = 1;  }  public View findViewById(int viewId) {      switch ( viewType ) {          case 0:              return mView.findViewById(viewId);          case 1:              return mActivity.findViewById(viewId);      }      return null;  }

}

ViewId

@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)public @interface ViewId {      int value();}

OnClick

@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public @interface OnClick {    int[] value();}

更多相关文章

  1. 三、ANDROID SDK下文件解析
  2. 编译cubieboard android 源码过程详解之(七):lichee build
  3. Android(安卓)Studio 初次见面(AVD加速)
  4. Android(安卓)Dialog 对话框详解及示例代码
  5. Android中Shape Drawable在xml中的使用
  6. 配置android的adb环境变量
  7. Android(安卓)获取APK编译时间
  8. android中打开相机、打开相册进行图片的获取示例
  9. 保存和重入Activity 状态的最简单方法

随机推荐

  1. Android 怎样获得手机信息(二)
  2. Android分辨率自适应
  3. Android中文API(146) —— Display
  4. Android(安卓)电话的反射调用机制实现静
  5. Android Activity切换动画详解及实例
  6. Android手机中获取手机号码和运营商信息
  7. Android(安卓)VelocityTracker的使用
  8. Android Studio3.4.2配置NDK
  9. Android系统源代码下载
  10. Android Build 系统