Android-反射+注解获取控件ID
2016-08-03 23:08
288 查看
Android-反射+注解获取控件ID
通常我们最常规的方法就是通过findViewById这个方法拿到每个我们所定义控件的ID,对于一两个控件来说,我们还是能接受这个方法去得到对应的ID,但是一旦我们的控件比较多的情况下就会写很多代码去
拿到对应的ID了,为了节省内存空间,我们可以通过反射+注解来拿到我们所有控件所对应的ID
MainActivity.java
public class MainActivity extends AppCompatActivity{ //只需要在每个ID上设置对应的注解即可 @FindIdAnno(R.id.img1) private ImageView img1; @FindIdAnno(R.id.img2) private ImageView img2; @FindIdAnno(R.id.img3) private ImageView img3; @FindIdAnno(R.id.img4) private ImageView img4; @FindIdAnno(R.id.img5) private ImageView img5; @FindIdAnno(R.id.img6) private ImageView img6; @FindIdAnno(R.id.btn_load) private Button btn_load; @FindIdAnno(R.id.seekBar) private ProgressBar prog; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //通过反射+注解拿到每个控件的ID FindId.findById(MainActivity.this); }
FindId.java
public class FindId { public static void findById(Activity activity){ //获取每个activity对应的类类型 Class<? extends Activity> aClass = activity.getClass(); //获取该类型中所有的属性信息 Field[] fields = aClass.getDeclaredFields(); //遍历每个属性信息 for (Field field : fields) { //判断该属性上是否有FindIdAnno这个注解的类类型 FindIdAnno anno = field.getAnnotation(FindIdAnno.class); //如果有就会拿到对应的注解信息,没有就会返回空 if(anno != null){ //判断该属性是否是属于View的子类类型,并且不是静态属性 if(View.class.isAssignableFrom(field.getType()) && !Modifier.isStatic(field.getModifiers())){ try { //拿到注解上的ID int id = anno.value(); //拿到该类中的findViewById方法,对应传参为int类型 Method byId = aClass.getMethod("findViewById", int.class); //然后执行该findViewById的方法 Object invoke = byId.invoke(activity, id); //如果属性是私有的就修改一些访问权限,以便于我们修改值 field.setAccessible(true); //将拿到的参数设置到对应的属性上,大公告成 field.set(activity,invoke); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } } } } }
FindIdAnno.java 注解类
//作用域为属性 @Target(ElementType.FIELD) //运行时的有效 @Retention(RetentionPolicy.RUNTIME) public @interface FindIdAnno { //属性上的值为int类型 int value(); }
基本上就完成了,这样就可以拿到设置对应的ID了,代码可能还有一些没有优化,不过基本功能还是可以用的
相关文章推荐
- Android反射+注解获取控件ID
- android 根据控件的ID字符串利用反射获取UI控件
- Android利用资源名称获取其ID(二)--->反射
- Android:资源 id 及资源 id 的动态获取和反射获取
- Android中通过反射获取资源Id
- android通过反射获取资源ID的工具类
- Android自动化测试—获取、区分具有相同Id的多个控件
- android换肤功能中,如何动态获取控件中背景图片的资源id?
- Android中通过反射获取资源Id
- 自定义注解 获取控件id
- Android反射获取资源 id通用工具类
- Android获取动态添加控件的Id
- Android根据反射获取R文件中的字段值即id值
- android 下动态获取控件的id
- android 动态获取控件的ID
- android通过反射代替R来获取控件对象
- Android中通过反射获取资源Id(特别用在自己定义一个工具将其打成.jar包时,特别注意资源的获取)
- Android中通过反射获取资源Id
- Android自定义Dialog弹窗获取Dialog中的控件ID
- android 自定义注解 通过反射获取注解属性值