通过注解可以减少很多重复的代码。比如findviewById,seonclickListener等。
1.创建BindView注解(用于成员变量,在运行时存在)
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface BindView {
int value() default -1;
}
2.创建Click注解(用于方法,在运行时存在)
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Click {
int value() default -1;
}
3.创建一个处理注解的静态类
public class AnnocationUtils {
public static void analysisAnnocation(final Activity activity) {
Class clazz = activity.getClass();
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
if (field.isAnnotationPresent(BindView.class)) {
BindView bindView = field.getAnnotation(BindView.class);
int id = bindView.value();
if (id > 0) {
field.setAccessible(true);
try {
field.set(activity, activity.findViewById(id));
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
}
Method[] methods = clazz.getDeclaredMethods();
for (final Method method : methods) {
if (method.isAnnotationPresent(Click.class)) {
Click click = method.getAnnotation(Click.class);
int id = click.value();
if (id > 0) {
View view = activity.findViewById(id);
method.setAccessible(true);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
method.invoke(activity);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
});
}
}
}
}
}
主要的功能是:通过反射得到activity的成员变量和方法。再判断成员变量和方法是否被注解过了,如果被注解过了,就获取注解,得到id,判断是否大于1,最后成员变量的执行设置属性值(set),方法的执行方法(invoke)
在Activity中使用注解:
public class MainActivity extends AppCompatActivity {
private String TAG = "MainActivity";
@BindView(R.id.btn_click1)
private Button btn_1;
@BindView(R.id.btn_click2)
private Button btn_2;
@BindView(R.id.btn_click3)
private Button btn_3;
int REQUEST_PERMISSION_CODE = 1001;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
AnnocationUtils.analysisAnnocation(this);
btn_1.setText("我是按钮1");
btn_2.setText("我是按钮2");
btn_3.setText("我是按钮3");
}
@Click(R.id.btn_click1)
private void onClick(){
Log.e(TAG,"我是按钮11");
}
@Click(R.id.btn_click2)
public void onClick2(){
Log.e(TAG,"我是按钮22");
}
@Click(R.id.btn_click3)
protected void onClick3(){
Log.e(TAG,"我是按钮33");
}