Android 标识绑定View
16lz
2021-01-23
如有不对的地方,望各路大神指点,小女子在此谢过,(*^__^*) 嘻嘻……,要是觉得不错,记得给个赞哦
1.Injector类
package com.mobivans.stock.tools.annotation;import android.app.Activity;import android.view.View;import java.lang.reflect.Field;import java.util.List;public class Injector { /** * 注入绑定view * * @param fieldOwner * @param activity */ public static void inject(Object fieldOwner, Activity activity) { try { // 绑定View injectView(fieldOwner, activity); } catch (Exception e) { throw new RuntimeException(e); } } /** * 注入绑定view * * @param fieldOwner * @param view */ public static void inject(Object fieldOwner, View view) { try { // 绑定View injectView(fieldOwner, view); } catch (Exception e) { throw new RuntimeException(e); } } private static void injectView(Object fieldOwner, Object viewProvider) throws Exception { List fields = ReflectUtils.getFields(fieldOwner.getClass()); for (Field field : fields) { ViewId viewId = field.getAnnotation(ViewId.class); if (viewId == null) { continue; } Object view = null; if (viewProvider instanceof Activity) { view = ((Activity) viewProvider).findViewById(viewId.value()); } else if (viewProvider instanceof View) { view = ((View) viewProvider).findViewById(viewId.value()); } if (view != null) { field.setAccessible(true); field.set(fieldOwner, view); } } }}
2.ReflectUtils类
package com.mobivans.stock.tools.annotation;import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.lang.reflect.Modifier;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;/** * @describe:反射相关辅助函数 */public class ReflectUtils { /** * 反射调用类成员函数 * * @param instance * @param name * @param paramTypes * @param paramValues * @return * @throws NoSuchMethodException * @throws InvocationTargetException * @throws IllegalAccessException */ public static Object invokeMethod(Object instance, String name, Class<?>[] paramTypes, Object[] paramValues) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { Class<?> clazz = instance.getClass(); Method method = getMethod(clazz, name, paramTypes); method.setAccessible(true); return method.invoke(instance, paramValues); } /** * 反射调用类静态成员函数 * * @param clazz * @param name * @param paramTypes * @param paramValues * @return * @throws NoSuchMethodException * @throws InvocationTargetException * @throws IllegalAccessException */ public static Object invokeStaticMethod(Class<?> clazz, String name, Class<?>[] paramTypes, Object[] paramValues) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { Method method = getMethod(clazz, name, paramTypes); method.setAccessible(true); return method.invoke(clazz, paramValues); } /** * 设置类成员变量 * * @param instance * @param name * @param value * @throws NoSuchFieldException * @throws IllegalAccessException */ public static void setFieldValue(Object instance, String name, Object value) throws NoSuchFieldException, IllegalAccessException { Class<?> clazz = instance.getClass(); Field field = getField(clazz, name); field.setAccessible(true); field.set(instance, value); } /** * 设置类静态成员变量 * * @param clazz * @param name * @param value * @throws NoSuchFieldException * @throws IllegalAccessException */ public static void setStaticFieldValue(Class<?> clazz, String name, Object value) throws NoSuchFieldException, IllegalAccessException { Field field = getField(clazz, name); field.setAccessible(true); field.set(clazz, value); } /** * 获取类属性值 * * @param instance * @param name * @return * @throws NoSuchFieldException * @throws IllegalAccessException */ public static Object getFieldValue(Object instance, String name) throws NoSuchFieldException, IllegalAccessException { Class<?> clazz = instance.getClass(); Field field = getField(clazz, name); field.setAccessible(true); return field.get(instance); } /** * 获取类静态属性值 * * @param clazz * @param name * @return * @throws NoSuchFieldException * @throws IllegalAccessException */ public static Object getStaticFieldValue(Class<?> clazz, String name) throws NoSuchFieldException, IllegalAccessException { Field field = getField(clazz, name); field.setAccessible(true); return field.get(clazz); } /** * 获取类所有成员变量 * * @param instance * @return * @throws IllegalAccessException */ public static Map getFieldMap(Object instance) throws IllegalAccessException { return getFieldMapInternal(instance.getClass(), instance, false); } /** * 获取类所有静态变量 * * @param clazz * @return * @throws IllegalAccessException */ public static Map getStaticFieldMap(Class<?> clazz) throws IllegalAccessException { return getFieldMapInternal(clazz, null, true); } /** * 获取类所有成员变量,包含定义在父类的成员 * * @param clazz * @return */ public static List getFields(Class<?> clazz) { List fields = new ArrayList(); for (Field field : clazz.getDeclaredFields()) { fields.add(field); } if ((clazz != Object.class) && (clazz.getSuperclass() != null)) { fields.addAll(getFields(clazz.getSuperclass())); } return fields; } /** * 获取类所有成员函数,包含定义在父类的成员 * * @param clazz * @return */ public static List getMethods(Class<?> clazz) { List methods = new ArrayList(); for (Method method : clazz.getDeclaredMethods()) { methods.add(method); } if ((clazz != Object.class) && (clazz.getSuperclass() != null)) { methods.addAll(getMethods(clazz.getSuperclass())); } return methods; } /** * 判断一个类是否集成自另一个类 * * @param child * @param parent * @return */ public static boolean isSubClassOf(Class<?> child, Class<?> parent) { if (child == null) { return false; } if (child == parent) { return true; } if (child == Object.class) { return false; } return isSubClassOf(child.getSuperclass(), parent); } private static Method getMethod(Class<?> clazz, String name, Class<?>[] paramTypes) throws NoSuchMethodException { try { return clazz.getDeclaredMethod(name, paramTypes); } catch (NoSuchMethodException e) { if (clazz.getSuperclass() != null) { return getMethod(clazz.getSuperclass(), name, paramTypes); } else { throw e; } } } private static Field getField(Class<?> clazz, String name) throws NoSuchFieldException { try { return clazz.getDeclaredField(name); } catch (NoSuchFieldException e) { if (clazz.getSuperclass() != null) { return getField(clazz.getSuperclass(), name); } else { throw e; } } } private static Map getFieldMapInternal(Class<?> clazz, Object instance, boolean isStatic) throws IllegalAccessException { Map result = new HashMap(); List fields = getFields(clazz); for (Field field : fields) { field.setAccessible(true); if (isStatic && Modifier.isStatic(field.getModifiers())) { result.put(field.getName(), field.get(clazz)); } else { if (instance == null) { continue; } result.put(field.getName(), field.get(instance)); } } return result; }}
3.ViewId
package com.mobivans.stock.tools.annotation;import android.view.View;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;/** * @describe:标识绑定的View */@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.FIELD})public @interface ViewId { int value() default View.NO_ID;}
使用方法:
@ViewId(R.id.home_recycleView) MyRecyclerView recyclerView;
在Activity的oncreate方法初始化
@Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_feedback); Injector.inject(this, this); }
在fragment的onCreateView()方法初始化
@Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_information, container, false); Injector.inject(this, view); return view; }
注意:别忘记了初始化哦
更多相关文章
- mac 下配置ANDROID_HOME环境变量
- android保存全局变量
- Ubuntu 设置Android adb 环境变量
- Java环境变量和Android环境变量
- Android train——ListView绑定ArrayAdapter、SimpleAdapter、Si
- 绑定方式开始服务&调用服务的方法
- android databing数据绑定的简单使用
- java android maven环境变量基本配置
- android USB绑定功能实现(framework)