Android反射+注解获取控件ID
2017-11-01 11:13
756 查看
我们还是能接受这个方法去得到对应的ID,但是一旦我们的控件比较多的情况下就会写很多代码去
拿到对应的ID了,为了节省内存空间,我们可以通过反射+注解来拿到我们所有控件所对应的ID
MainActivity.java
public class MainActivity extends AppCompatActivity {
@Viewid(R.id.tv)
private TextView tv;
@Viewid(R.id.image1)
private ImageView imageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Findid.findByid(MainActivity.this);
tv.setText("注解获取控件ID");
}
}
Viewid.java 注解类
//作用域为属性
@Target(ElementType.FIELD)
//运行时的有效
@Retention(RetentionPolicy.RUNTIME)
public @interface Viewid {
//属性上的值为int类型
int value();
}
Find .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){
//判断该属性上是否有Viewid这个注解的类类型
Viewid viewid = field.getAnnotation(Viewid.class);
//如果有就会拿到对应的注解信息,没有就会返回空
if (viewid!=null){
//判断该属性是否是属于View的子类类型,并且不是静态属性
if(View.class.isAssignableFrom(field.getType()) &&!Modifier.isStatic(field.getModifiers())){
try {
//拿到注解上的ID
int id = viewid.value();
//拿到该类中的findViewById方法,对应传参为int类型
Method byId = null;
byId = aClass.getMethod("findViewById", int.class);
//然后执行该findViewById的方法
Object invoke = byId.invoke(activity, id);
//如果属性是私有的就修改一些访问权限,以便于我们修改值
field.setAccessible(true);
//将拿到的参数设置到对应的属性上,大公告成
field.set(activity,invoke);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
}
这样就可以拿到设置对应的ID了,代码可能还有一些没有优化,不过基本功能还是可以用的
拿到对应的ID了,为了节省内存空间,我们可以通过反射+注解来拿到我们所有控件所对应的ID
MainActivity.java
public class MainActivity extends AppCompatActivity {
@Viewid(R.id.tv)
private TextView tv;
@Viewid(R.id.image1)
private ImageView imageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Findid.findByid(MainActivity.this);
tv.setText("注解获取控件ID");
}
}
Viewid.java 注解类
//作用域为属性
@Target(ElementType.FIELD)
//运行时的有效
@Retention(RetentionPolicy.RUNTIME)
public @interface Viewid {
//属性上的值为int类型
int value();
}
Find .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){
//判断该属性上是否有Viewid这个注解的类类型
Viewid viewid = field.getAnnotation(Viewid.class);
//如果有就会拿到对应的注解信息,没有就会返回空
if (viewid!=null){
//判断该属性是否是属于View的子类类型,并且不是静态属性
if(View.class.isAssignableFrom(field.getType()) &&!Modifier.isStatic(field.getModifiers())){
try {
//拿到注解上的ID
int id = viewid.value();
//拿到该类中的findViewById方法,对应传参为int类型
Method byId = null;
byId = aClass.getMethod("findViewById", int.class);
//然后执行该findViewById的方法
Object invoke = byId.invoke(activity, id);
//如果属性是私有的就修改一些访问权限,以便于我们修改值
field.setAccessible(true);
//将拿到的参数设置到对应的属性上,大公告成
field.set(activity,invoke);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
}
这样就可以拿到设置对应的ID了,代码可能还有一些没有优化,不过基本功能还是可以用的
相关文章推荐
- Android-反射+注解获取控件ID
- android 根据控件的ID字符串利用反射获取UI控件
- android 下动态获取控件的id
- Android Studio获取控件ID
- Android 使用反射获取系统ID值 com.android.internal.R.id.*
- Android自动化测试—获取、区分具有相同Id的多个控件
- android robotium获取相同id的的控件
- Android中通过反射获取资源Id
- Android编程实现通过反射获取资源Id的方法
- android换肤功能中,如何动态获取控件中背景图片的资源id?
- 如何使用appium desktop 获取Android APP 控件的id
- 常用插件Android Layout ID Converter ----布局ID、控件自动获取
- Android中通过反射获取资源Id
- android robotium获取相同id的的控件
- Android中通过反射获取资源Id(特别用在自己定义一个工具将其打成.jar包时,特别注意资源的获取)
- Android获取动态添加控件的Id
- Android自动化测试—获取、区分具有相同Id的多个控件
- android 动态获取控件的ID
- android通过反射获取资源ID的工具类
- 用反射和注解,绑定控件的id和点击事件