首页 > 代码库 > (一)Android使用自定义注解来初始化控件
(一)Android使用自定义注解来初始化控件
一般情况下我们开发Android应用,初始化控件使用findViewById(),可是一个项目开发完毕,你会发现很多这样的代码,其实是重复的。这个时候你就会发现Java自带的注释(Annotation)是多么的方便了。
一、设计一个ContentView的注释
因为这个注释我们要运在Activity类上,所以我们要申明@ElementType.TYPE。
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface ContentView { int value(); }
二、设计一个ContentWidget的注释
因为这个注释我们要运在类的成员变量上,所以我们要申明@ElementType.FILELD。类成员变量指定我们申明的控件对象
@Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface ContentWidget { int value(); }
三、设计一个工具类来提取并处理上述自定义的Annotation类的信息
public static void injectObject(Object object, Activity activity) { Class<?> classType = object.getClass(); // 该类是否存在ContentView类型的注解 if (classType.isAnnotationPresent(ContentView.class)) { // 返回存在的ContentView类型的注解 ContentView annotation = classType.getAnnotation(ContentView.class); try { // 返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法。 Method method = classType .getMethod("setContentView", int.class); method.setAccessible(true); int resId = annotation.value(); method.invoke(object, resId); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } } // 返回 Field 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的成员变量, // 包括公共、保护、默认(包)访问和私有成员变量,但不包括继承的成员变量。 Field[] fields = classType.getDeclaredFields(); if (null != fields && fields.length > 0) { for (Field field : fields) { // 该成员变量是否存在ContentWidget类型的注解 if (field.isAnnotationPresent(ContentWidget.class)) { ContentWidget annotation = field .getAnnotation(ContentWidget.class); int viewId = annotation.value(); View view = activity.findViewById(viewId); if (null != view) { try { field.setAccessible(true); field.set(object, view); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } } }
四、在Activity类中我们该怎么使用我们定义的注释
@ContentView(R.layout.activity_main) public class MainActivity extends Activity { @ContentWidget(R.id.tv) private TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // setContentView(R.layout.activity_main); ViewUtils.injectObject(this, this); textView.setText("自定义注释"); }
虽然前期准备的工作有点多,但后序我们的开发过程中对于加载布局和初始化控件会省事不少,这个对于大型项目来说,尤为重要,磨刀不误砍材工!
(一)Android使用自定义注解来初始化控件
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。