生活随笔
收集整理的這篇文章主要介紹了
Android 通过 annotation ViewInject
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
前言:
?通常對控件的獲取對象是通過sourceView.findViewById(R.id.xx)。通過獲取控件的中的注解形式實現一些控件對象。
如:
[java]?view plaincopy
@ViewInject(id=R.id.text_title)?? TextView?text_title;?? ?? @ViewInject(id=R.id.button,click="btnOk")?? Button?button;??
1、注解對象創建
[java]?view plaincopy
import?java.lang.annotation.ElementType;?? import?java.lang.annotation.Retention;?? import?java.lang.annotation.RetentionPolicy;?? import?java.lang.annotation.Target;?? ?? @Target(ElementType.FIELD)?? @Retention(RetentionPolicy.RUNTIME)?? public?@interface?ViewInject?{?? ????public?int?id();?? ????public?String?click()?default?"";?? }??
2、通過反射獲取控件對象,并且設置控件對象上面設置的點擊事件
[java]?view plaincopy
import?java.lang.reflect.Field;?? import?java.lang.reflect.InvocationTargetException;?? import?java.lang.reflect.Method;?? import?java.util.EventListener;?? ?? import?android.app.Activity;?? import?android.view.View;?? import?android.view.View.OnClickListener;?? ?? public?class?ViewInjectUtil?{?? ??????public?static?void?initViewInject(Activity?activity)?{?? ????????????initViewInject(activity,?activity.getWindow().getDecorView());?? ????????}?? ?? ????????private?static?void?initViewInject(final?Object?injectedSourse,?? ???????????????????????????????????????????View?sourceView)?{?? ????????????Field[]?fields?=?injectedSourse.getClass().getDeclaredFields();?? ????????????if?(fields?!=?null?&&?fields.length?>?0)?{?? ????????????????for?(Field?field?:?fields)?{?? ????????????????????try?{?? ?????????????????????????? ????????????????????????field.setAccessible(true);?? ????????????????????????if?(field.get(injectedSourse)?!=?null)?{?? ????????????????????????????continue;?? ????????????????????????}?? ????????????????????????ViewInject?mViewInject?=?field?? ????????????????????????????????.getAnnotation(ViewInject.class);?? ????????????????????????if?(mViewInject?!=?null)?{?? ????????????????????????????int?viewId?=?mViewInject.id();?? ????????????????????????????field.set(injectedSourse,?? ????????????????????????????????????sourceView.findViewById(viewId));?? ????????????????????????????Object?obj?=?field.get(injectedSourse);?? ????????????????????????????if?(obj?instanceof?View)?{?? ????????????????????????????????setMethodOnClick(obj,injectedSourse,mViewInject.click());?? ?? ?? ????????????????????????????}?? ?? ????????????????????????}?? ?? ????????????????????}?catch?(Exception?e)?{?? ?????????????????????????? ????????????????????}?? ?? ????????????????}?? ????????????}?? ?? ????????}?? ?? ????????private?static?void?setMethodOnClick(Object?obj,?final?Object?injectedSourse,String?methodName)?{?? ????????????final?Method?method?;?? ????????????try?{?? ????????????????method?=?injectedSourse.getClass()?? ???????????????????????.getDeclaredMethod(methodName,?? ???????????????????????????????View.class);?? ????????????????((View)?obj)?? ????????????????????????.setOnClickListener(new?OnClickListener()?{?? ?? ????????????????????????????@Override?? ????????????????????????????public?void?onClick(View?v)?{?? ????????????????????????????????try?{?? ????????????????????????????????????method.invoke(injectedSourse,?v);?? ????????????????????????????????}?catch?(IllegalAccessException?e)?{?? ?????????????????????????????????????? ?????????????????????????????????????? ????????????????????????????????????e.printStackTrace();?? ????????????????????????????????}?catch?(IllegalArgumentException?e)?{?? ?????????????????????????????????????? ?????????????????????????????????????? ????????????????????????????????????e.printStackTrace();?? ????????????????????????????????}?catch?(InvocationTargetException?e)?{?? ?????????????????????????????????????? ?????????????????????????????????????? ????????????????????????????????????e.printStackTrace();?? ????????????????????????????????}?? ????????????????????????????}?? ????????????????????????});?? ????????????}?catch?(NoSuchMethodException?e)?{?? ????????????????e.printStackTrace();?? ????????????}?? ?? ????????}?? }??
3、Demo演示
[java]?view plaincopy
public?class?MainActivity?extends?Activity?{?? ?? ????@ViewInject(id=R.id.text_title)?? ????TextView?text_title;?? ?????? ????@ViewInject(id=R.id.button,click="btnOk")?? ????Button?button;?? ?????? ????@Override?? ????protected?void?onCreate(Bundle?savedInstanceState)?{?? ????????super.onCreate(savedInstanceState);?? ????????setContentView(R.layout.activity_main);?? ????????ViewInjectUtil.initViewInject(MainActivity.this);?? ?????????? ?? ?????????? ????}?? ????public?void?btnOk(View?v){?? ????????text_title.setText("text?set?form?button");?? ?????}?? ?? ?? }??
總計:
本節的代碼參考了?https://github.com/yangfuhai/afinal 中實現的Code
反射的詳細Demo?
參考:http://my.oschina.net/zc741520/blog/195460
[java]?view plaincopy
package?demo.reflect;?? ?? import?java.lang.reflect.*;?? ?? public?class?ReflectDemo?{?? ?? ????? ? ?? ????public?static?void?main(String[]?args)?throws?ClassNotFoundException,?IllegalAccessException,?InstantiationException,?InvocationTargetException,?NoSuchFieldException,?NoSuchMethodException?{?? ?? ????????System.out.println("demo1:通過Java反射機制得到類的包名和類名");?? ????????demo1();?? ?? ????????System.out.println("");?? ????????System.out.println("demo2:驗證所有的類都是Class類的實例對象");?? ????????demo2();?? ?? ????????System.out.println("");?? ????????System.out.println("demo3:通過Java反射機制,用?Class?創建類對象,這也就是反射存在的意義所在");?? ????????demo3();?? ?? ????????System.out.println("");?? ????????System.out.println("demo4:通過Java反射機制得到一個類的構造函數,并實現創建帶參實例對象");?? ????????demo4();?? ?? ????????System.out.println("");?? ????????System.out.println("demo5:通過Java反射機制操作成員變量,?set?和?get");?? ????????demo5();?? ?? ????????System.out.println("");?? ????????System.out.println("demo6:通過Java反射機制得到類的一些屬性:繼承的接口、父類、函數信息、成員信息、類型等");?? ????????demo6();?? ?? ????????System.out.println("");?? ????????System.out.println("demo7:通過Java反射機制調用類方法");?? ????????demo7();?? ?? ????????System.out.println("");?? ????????System.out.println("demo8:通過Java反射機制得到類加載器信息");?? ????????demo8();?? ????}?? ?? ????? ? ?? ????public?static?void?demo1()?{?? ????????Person?person?=?new?Person();?? ????????System.out.println("包名:"?+?person.getClass().getPackage().getName());?? ????????System.out.println("完整類名:"?+?person.getClass().getName());?? ????}?? ?? ????? ? ?? ????public?static?void?demo2()?throws?ClassNotFoundException?{?? ?????????? ????????Class<?>?class1?=?null;?? ????????Class<?>?class2?=?null;?? ?????????? ????????class1?=?Class.forName("demo.reflect.Person");?? ????????System.out.println("寫法1,包名:"?+?class1.getPackage().getName()?+?"?,?完整類名:"?+?class1.getName());?? ?????????? ????????class2?=?Person.class;?? ????????System.out.println("寫法2,包名:"?+?class2.getPackage().getName()?+?"?,?完整類名:"?+?class2.getName());?? ????}?? ?? ????? ? ?? ????public?static?void?demo3()?throws?ClassNotFoundException,?InstantiationException,?IllegalAccessException?{?? ????????Class<?>?class1?=?null;?? ????????class1?=?Class.forName("demo.reflect.Person");?? ?????????? ???????? ? ? ?? ?????????? ????????Person?person=(Person)?Class.forName("demo.reflect.Person").newInstance();?? ????????person.setAge(30);?? ????????person.setName("wang");?? ????????System.out.println(person.getAge()+"??"+person.getName());?? ????}?? ?? ????? ? ?? ????public?static?void?demo4()?throws?ClassNotFoundException,?InstantiationException,?IllegalAccessException,?IllegalArgumentException,?InvocationTargetException?{?? ????????Class<?>?class1?=?null;?? ????????Person?person1?=?null;?? ????????Person?person2?=?null;?? ?? ????????class1?=?Class.forName("demo.reflect.Person");?? ????????Constructor<?>[]?constructors?=?class1.getConstructors();?? ?? ????????person1?=?(Person)?constructors[0].newInstance();?? ????????person1.setName("xiaoming");?? ????????person1.setAge(20);?? ????????System.out.println(person1.getName()?+?"?,?"?+?person1.getAge());?? ????????person2?=?(Person)?constructors[1].newInstance(21,?"xiaohong");?? ????????System.out.println(person2.getName()?+?"?,?"?+?person2.getAge());?? ????}?? ?? ????? ? ?? ????public?static?void?demo5()?throws?ClassNotFoundException,?IllegalAccessException,?InstantiationException,?NoSuchFieldException,?SecurityException?{?? ????????Class<?>?class1?=?Class.forName("demo.reflect.Person");?? ????????Object?obj?=?class1.newInstance();?? ????????Field?personNameField?=?class1.getDeclaredField("name");?? ????????personNameField.setAccessible(true);??? ????????personNameField.set(obj,?"小虎");?? ????????System.out.println("修改屬性之后得到屬性變量的值:"?+?personNameField.get(obj));?? ????}?? ?? ????? ? ?? ????public?static?void?demo6()?throws?ClassNotFoundException?{?? ????????Class<?>?class1?=?Class.forName("demo.reflect.SuperMan");?? ?? ?????????? ????????Class<?>?superclass?=?class1.getSuperclass();?? ????????System.out.println("SuperMan類的父類名:"?+?superclass.getName());?? ?? ????????Field[]?fields?=?class1.getDeclaredFields();?? ????????for?(int?i?=?0;?i?<?fields.length;?i++)?{?? ????????????System.out.println("類中的成員"?+?i?+?":?"?+?fields[i]);?? ????????}?? ?? ?????????? ????????Method[]?methods?=?class1.getDeclaredMethods();?? ????????for?(int?i?=?0;?i?<?methods.length;?i++)?{?? ????????????System.out.println("取得SuperMan類的方法"?+?i?+?":");?? ????????????System.out.println("函數名:"?+?methods[i].getName());?? ????????????System.out.println("函數返回類型:"?+?methods[i].getReturnType());?? ????????????System.out.println("函數訪問修飾符:"?+?Modifier.toString(methods[i].getModifiers()));?? ????????????System.out.println("函數代碼寫法:?"?+?methods[i]);?? ????????}?? ?? ?????????? ????????Class<?>?interfaces[]?=?class1.getInterfaces();?? ????????for?(int?i?=?0;?i?<?interfaces.length;?i++)?{?? ????????????System.out.println("實現的接口類名:?"?+?interfaces[i].getName());?? ????????}?? ????}?? ?? ????? ? ?? ????public?static?void?demo7()?throws?ClassNotFoundException,?NoSuchMethodException,?IllegalAccessException,?InstantiationException,?InvocationTargetException?{?? ????????Class<?>?class1?=?Class.forName("demo.reflect.SuperMan");?? ?? ????????System.out.println("調用無參方法fly():");?? ????????Method?method?=?class1.getMethod("fly");?? ????????method.invoke(class1.newInstance());?? ?? ????????System.out.println("調用有參方法walk(int?m):");?? ????????method?=?class1.getMethod("walk",?int.class);?? ????????method.invoke(class1.newInstance(),?100);?? ????}?? ?? ????? ? ? ? ? ? ?? ????public?static?void?demo8()?throws?ClassNotFoundException?{?? ????????Class<?>?class1?=?Class.forName("demo.reflect.SuperMan");?? ????????String?name?=?class1.getClassLoader().getClass().getName();?? ????????System.out.println("類加載器類名:"?+?name);?? ????}?? ?? }?? ?? class?Person?{?? ????private?int?age;?? ????private?String?name;?? ?? ????public?Person()?{?? ?? ????}?? ?? ????public?Person(int?age,?String?name)?{?? ????????this.age?=?age;?? ????????this.name?=?name;?? ????}?? ?? ????public?int?getAge()?{?? ????????return?age;?? ????}?? ?? ????public?void?setAge(int?age)?{?? ????????this.age?=?age;?? ????}?? ?? ????public?String?getName()?{?? ????????return?name;?? ????}?? ?? ????public?void?setName(String?name)?{?? ????????this.name?=?name;?? ????}?? }?? ?? interface?ActionInterface?{?? ????public?void?walk(int?m);?? }?? ?? class?SuperMan?extends?Person?implements?ActionInterface?{?? ????private?boolean?blueBriefs;?? ?? ????public?void?fly()?{?? ????????System.out.println("超人會飛耶~~");?? ????}?? ?? ????public?boolean?isBlueBriefs()?{?? ????????return?blueBriefs;?? ????}?? ?? ????public?void?setBlueBriefs(boolean?blueBriefs)?{?? ????????this.blueBriefs?=?blueBriefs;?? ????}?? ?? ????@Override?? ????public?void?walk(int?m)?{?? ????????System.out.println("超人會走耶~~走了"?+?m?+?"米就走不動了!");?? ????}?? } ?
總結
以上是生活随笔為你收集整理的Android 通过 annotation ViewInject的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。