Android反射+注解获取控件ID

我们还是能接受这个方法去得到对应的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了,代码可能还有一些没有优化,不过基本功能还是可以用的



猜你喜欢

转载自blog.csdn.net/w2316/article/details/78412003