ContentView注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME) //一直保留到加载虚拟机中
//@Retention(RetentionPolicy.CLASS) //编译到字节码中,当虚拟机加载这个字节码时,注解信息会被清除
//@Retention(RetentionPolicy.SOURCE) //只会在源码出现,当源码编译成字节码时,注解信息会被清除
public @interface ContentView {
int value();
}
ViewInject注解
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ViewInject {
int value();
}
OnClick注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface OnClick {
int[] value();
}
绑定
public class ViewInjector {
public static void bind(Activity activity) {
injectLayout(activity);
injectView(activity);
injectEvents(activity);
}
/*绑定ContentView*/
private static void injectLayout(Activity activity) {
Class<?> clazz = activity.getClass();
ContentView inject = clazz.getAnnotation(ContentView.class);
if (inject != null) {
int id = inject.value();
try {
Method setContentView = clazz.getMethod("setContentView", int.class);
setContentView.invoke(activity, id);
} catch (Exception e) {
e.printStackTrace();
}
}
}
/*绑定ViewInject*/
private static void injectView(Activity activity) {
Class<?> clazz = activity.getClass();
Field[] declaredFields = clazz.getDeclaredFields();
for (int i = 0; i < declaredFields.length; i++) {
Field field = declaredFields[i];
ViewInject inject = field.getAnnotation(ViewInject.class);
if (inject != null) {
int id = inject.value();
try {
Method findViewById = clazz.getMethod("findViewById", int.class);
View view = (View) findViewById.invoke(activity, id);
field.setAccessible(true);
field.set(activity, view);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
/*绑定OnClick*/
private static void injectEvents(final Activity activity) {
Class<?> clazz = activity.getClass();
Method[] methods = clazz.getDeclaredMethods();
for (final Method method : methods) {
OnClick onClick = method.getAnnotation(OnClick.class);
if (onClick != null) {
int[] ids = onClick.value();
for (int id : ids) {
final View view = activity.findViewById(id);
if(view != null){
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
method.setAccessible(true);
try {
method.invoke(activity, view);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
}
}
}
}
}
测试
@ContentView(R.layout.activity_main)
public class MainActivity extends AppCompatActivity {
@ViewInject(R.id.btn_test1)
Button btn1;
@ViewInject(R.id.btn_test2)
Button btn2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ViewInjector.bind(this);
}
@OnClick({R.id.btn_test1, R.id.btn_test2})
public void onClick(View view) {
System.out.println(this);
if (view == btn1) {
Toast.makeText(MainActivity.this, "点击了btn1", Toast.LENGTH_SHORT).show();
}
if (view == btn2) {
Toast.makeText(MainActivity.this, "点击了btn2", Toast.LENGTH_SHORT).show();
}
}
}
网友评论