Android中巧妙运用反射和注解,同时控制所有同类控件

   讲到反射和注解我也是一知半解,但是俗话说得好,熟能生巧,在我多番应用和实践中掌握了一些技巧和大家分享一下。
   比如大家需要实现一下同时控制当前Activity所有EditText的可编辑属性或者是控制所有的Button的可点击属性等等。就好像大家用QQ点击编辑按钮之后,才可以修改信息,不点击就只能看个人信息,而不能修改一样的情况。
   EditText的可编辑属性可以通过xml文件中editable="true"来实现,当然也可以通过java代码来实现,但是这时候就需要两个属性配合使用:setFocusableInTouchMode(true)以及requestFocus() 来实现可以编辑,而如果想要设置为不可编辑,就需要:setFocusableInTouchMode(false)以及clearFocus()这两个属性实现。
   而Button的是否可点击直接用属性setEnabled(flag)  flag 为 boolean类型

下面这段代码仅仅是操作同类控件的形同属性的方法,实现注解的方法
在我的另外一篇博客(讲解如何使用注解和反射实现绑定控件)中有用到。
自己学着写一个BindView来减少findViewById的应用

public void setAllEditTextEditableState(boolean isEditable,Activity act){
    View rootView = act.getWindow().getDecorView();  //DecorView为整个Window界面的最顶层View
    int fieldsCount = fields.length();
    for(int i=0;i<fieldsCount;i++){
        Field field = fields[i];
        BindView bindView = field.getAnnotation(BindView.class);
        if(bindView!=null){
            int view_id = bindView.id();    //得到当前空间的id
            field.setAccessible(true);      //当前为私有变量,私有变量不可直接调用,该方法使私有可用
            View view = rootView.findViewById(view_id);
            if(view instanceof EditText){    //EditText 当然也可以变成Button,这里以EditText为例
                if(isEditable){
                  view.setFocusableInTouchMode(isEditable);
                  view.requestFocus();
                }else{
                  view.setFocusableInTouchMode(isEditable);
                  view.clearFocus();
                }
            }else if(view instanceof Botton){
                if(isEditable){
                    view.setEnable(isEditable);
                    view.setAlpha(0.88f);    //设置透明度,是的空间整体变稍灰
                }else{
                    view.setEnable(isEditable);
                    view.setAlpha(1);
                }
            }
            try{
                 field.set(act,view);
            }catch(IllegalAccessException e){

            }

        }
    }


}

猜你喜欢

转载自blog.csdn.net/qq_35920289/article/details/77051014