Activity上的注解实现
注解的基础知识
@Target(用于注解属性或方法):ElementType.FIELD、ElementType.METHOD
@Retention(处理的时机):RetetionPolicy.SOURCE、RetetionPolicy.CLASS、RetetionPolicy.RUNTIME
注解的实现步骤
### 1、实现注解类
// 用于注解属性
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface FindView {
int value() default 0;
}
// 用于注解方法
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Onclick {
int value() default 0;
}
2、解读注解方法类
public class ViewUtils {
/*
* 注解类的实现主要是通过反射机制去实现
*/
public static void register(Activity activity) {
registerField(activity);
registerMethod(activity);
}
public static void registerField(Activity activity) {
// 通过反射机制,找到类的所有属性
Class<?> clazz = activity.getClass();
Field[] fields = clazz.getDeclaredFields();
try {
for (Field field : fields) {
// 判断属性中是否有相应的注解
if (field.isAnnotationPresent(FindView.class)) {
// 获取注解类中的value值,即view的id值
FindView findView = field.getAnnotation(FindView.class);
int viewId = findView.value();
if (viewId > 0) {
// 通过id值找到相应的view,并进行赋值
field.setAccessible(true);
field.set(activity, activity.findViewById(viewId));
}
}
}
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
}
public static void registerMethod(final Activity activity) {
// 通过反射机制,找到类的所有方法
Class<?> clazz = activity.getClass();
Method[] methods = clazz.getDeclaredMethods();
for (final Method method : methods) {
// 判断方法中是否有相应的注解
if (method.isAnnotationPresent(Onclick.class)) {
// 获取注解类中的value值,即view的id值
int viewId = method.getAnnotation(Onclick.class).value();
if (viewId > 0) {
// 通过id值找到相应的view,并添加事件监听
final View view = activity.findViewById(viewId);
view.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
try {
method.invoke(activity, view);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
});
}
}
}
}
}
注解的测试类
public class MainActivity extends Activity {
@FindView(R.id.btn_first)
private Button btnFirst;
@FindView(R.id.btn_second)
private Button btnSecond;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ViewUtils.register(this);
}
@Onclick(R.id.btn_first)
public void onFirstClick(View view) {
btnFirst.setText("我是第一个按钮");
Toast.makeText(this, "哈哈哈!", Toast.LENGTH_SHORT).show();
}
@Onclick(R.id.btn_second)
public void onSecondClick(View view) {
btnSecond.setText("俺不只是一个按钮");
Toast.makeText(this, "俺被点击了啊!", Toast.LENGTH_SHORT).show();
}
}
测试类的布局文件 activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<Button
android:id="@+id/btn_first"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="first" />
<Button
android:id="@+id/btn_second"
android:layout_below="@+id/btn_first"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="second" />
</RelativeLayout>
本文详细介绍了注解的基础知识,包括@Target和@Retention的使用,并提供了注解在Activity上的具体实现步骤和测试类,展示了如何通过反射机制为属性和方法添加注解,以简化UI组件的查找和绑定。

849

被折叠的 条评论
为什么被折叠?



