if (field.isAnnotationPresent(InjectView.class)) //方法返回true,如果指定类型的注解存在于此元素上 { Log.i("Field", field.toString());
InjectView mInjectView = field.getAnnotation(InjectView.class); //获得该成员的annotation int viewId = mInjectView.id(); //获得该注解的id View view=activity.findViewById(viewId); //获得ID为viewID的组件对象
Log.i("Field", String.valueOf(viewId)); Log.i("Field", view.getClass().toString());
try { field.setAccessible(true); //设置类的私有成员变量可以被访问 field.set(activity, view); //field.set(object,value)===object.fieldValue = value } catch (Exception e) { e.printStackTrace();} } else Log.i("Field", "该字段没有被注解"); } } } }
布局文件 activity_main.xml [html] <LinearLayout xmlns:android="" xmlns:tools="" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#000000" android:orientation="vertical" tools:ignore="ContentDescription" > <ImageView android:id="@+id/myimgview" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center"/> <TextView android:id="@+id/mytext" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:gravity="center" android:background="@android:color/darker_gray" android:textSize="30sp" /> </LinearLayout>
实验结果
即注入成功了
需要说下我遇到的问题,在以上的基础上,如果将布局文件里的TextView 和ImageView两个布局换个位置,这时候再运行下,会出现空指针异常。
将Log向上翻会发现一个警告
即非法参数异常
定位到这一行
[java] field.set(activity, view);
通过观察Log打印的日志
发现第一二行是对的,即获得注解的类型和ID(ImageView 2131230720)都是正确的,但是通过findViewById获取view的时候,Log第三行显示的却是TextView。
百思不得其解,最后无赖之下,清理一下项目,搞定。
我不知道是怎么回事,暂且推测为资源缓存吧。 |
Android框架进阶--ThinkAndroid注解机制(2)
最新推荐文章于 2024-05-06 11:32:14 发布
if (field.isAnnotationPresent(InjectView.class)) //方法返回true,如果指定类型的注解存在于此元素上 { Log.i(Field, field.toString()); InjectView mInjectView = field.getAnnotation(InjectView.class); //