您的位置:首页 > 移动开发 > Android开发

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了,代码可能还有一些没有优化,不过基本功能还是可以用的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: