1、创建注解类(Target注解是值注解的对象,FIELD是属性,METHOD是方法,指该注解用来注解属性或方法,Retention指注解优先级,指定注解有效时机),注解类中有一个方法int value()指接收一个int的参数,另一个int[] value()指接收int数组参数
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface BingView {
int value();
}
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface OnClick {
int[] value();
}
2、创建注解管理器,用它来实际绑定注解使用逻辑(通过Bing绑定Activity,反射获得其属性和方法,遍历其属性通过Field或Method的getAnnotation的方法获得注解对象,如果getAnnotation为空的话说明该方法或属性没有使用注解,再通过注解对象的value可以获得注解传入的参数)
public class MBingView {
@NonNull
@UiThread
public static void Bing(Activity activity) {
findViewById(activity);
OnClick(activity);
}
private static void findViewById(Activity activity) {
Class<? extends Activity> cl = activity.getClass();
//获取activity中的私有属性
Field[] declaredFields = cl.getDeclaredFields();
for (int i = 0; i < declaredFields.length; i++) {
//遍历属性获得BingView注解对象
Field field = declaredFields[i];
BingView bingView = field.getAnnotation(BingView.class);
if (bingView != null) {
//获得注解参数
int Viewid = bingView.value();
View view = activity.findViewById(Viewid);
try {
field.setAccessible(true);
field.set(activity, view);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
private static void OnClick(final Activity activity) {
Class<?> clazz = activity.getClass();
try {
//遍历Activity中的方法,尝试获取OncClick的注解(不为空就是有注解)
Method[] methods = clazz.getMethods();
for (final Method method : methods) {
OnClick onClick = method.getAnnotation(OnClick.class);
if (onClick != null) {
//获取注解的参数
int[] viewIds = onClick.value();
for (int viewId : viewIds) {
final View view = activity.findViewById(viewId);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
method.setAccessible(true);
try {
method.invoke(activity, view);
} catch (IllegalAccessException e1) {
e1.printStackTrace();
} catch (InvocationTargetException e1) {
e1.printStackTrace();
}
}
});
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
3、实际使用
public class MainActivity extends AppCompatActivity {
@BingView(R.id.tv)
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MBingView.Bing(this);
textView.setText("findview事件");
}
@OnClick({R.id.tv,R.id.btn})
public void onClick(View v) {
if (v.getId() == R.id.tv) {
Toast.makeText(MainActivity.this, "点击了文本", Toast.LENGTH_SHORT).show();
}
if (v.getId() == R.id.btn) {
Toast.makeText(MainActivity.this, "点击了按钮", Toast.LENGTH_SHORT).show();
}
}
}