手写findviewbyid和使用注解给变量赋值

2023-05-16

手写findviewbyid和使用注解给变量赋值
使用到注解和反射
注解本身没有什么含义,只有配合反射和插桩技术时才能体现价值

我们平时要初始化view都需要调用findviewbyid,那我们可不可以省去这一步呢?答案当然是可以的,下面我们就一块看看具体是怎么实现的。

首先要了解注解和反射,不理解的小伙伴,去百度查一下,这里就不一一解释了

//findviewbyid 的注解
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AutoFindView {

   @IdRes int value();
}

用于初始化,在setcontentview之后调用就可以了

public class InitView {

    public static void init(Activity activity) throws IllegalAccessException {
        Class<? extends Activity> aClass = activity.getClass();
        Intent intent = activity.getIntent();
        Bundle extras = intent.getExtras();
        Field[] fields = aClass.getDeclaredFields();
        for (Field field : fields) {
          
            if (field.isAnnotationPresent(AutoFindView.class)){
                View view = activity.findViewById(field.getAnnotation(AutoFindView.class).value());
                field.setAccessible(true);
                field.set(activity,view);
            }
        }
    }
}

调用示例

@AutoFindView(R.id.editText)
    private EditText editText;
    
 protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.a_layout);
        try {
            InitView.init(this);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }

我们还可以利用反射+注解实现变量自动复制,比如当我们使用intent传值的时候

 Intent intent = new Intent(this,BActivity.class);
        intent.putExtra("name",editText.getText().toString());
        startActivity(intent);

在BActivity中接收

  @AutoValue
    private String name;
    private String TAG = getClass().getName();
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        try {
            InitView.init(this);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        Log.e(TAG, "onCreate: name:"+name );
    }

赋值的注解

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AutoValue {

    String value() default "";
}

完整的InitView

public class InitView {

    public static void init(Activity activity) throws IllegalAccessException {
        Class<? extends Activity> aClass = activity.getClass();
        Intent intent = activity.getIntent();
        Bundle extras = intent.getExtras();
        Field[] fields = aClass.getDeclaredFields();
        for (Field field : fields) {
            if (field.isAnnotationPresent(AutoValue.class)) {
                Object o = extras.get(field.getName());
                 String autoValue = field.getAnnotation(AutoValue.class).value();
                String key = TextUtils.isEmpty(autoValue)?field.getName():autoValue;
                if (extras.keySet().contains(key)) {
                    Object o = extras.get(field.getName());
                    Class<?> componentType = field.getType().getComponentType();
                    //Parcelabled数组需要特殊处理一下
                    if (field.getType().isArray() && Parcelable.class.isAssignableFrom(componentType)) {
                        Object[] objects = (Object[]) o;

                        Object[] objects2 = Arrays.copyOf(objects, objects.length, (Class<? extends Object[]>) field.getType());

                        o = objects2;
                    }
                if (o != null) {
                    field.setAccessible(true);
                    field.set(activity,o);
                }
            }
            if (field.isAnnotationPresent(AutoFindView.class)){
                View view = activity.findViewById(field.getAnnotation(AutoFindView.class).value());
                field.setAccessible(true);
                field.set(activity,view);
            }
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

手写findviewbyid和使用注解给变量赋值 的相关文章

随机推荐

  • 嵌入式设备web服务器比较

    现在在嵌入式设备中所使用的web服务器主要有 xff1a boa thttpd mini httpd shttpd lighttpd goaheand appweb和apache等 Boa 1 介绍 Boa诞生于1991年 xff0c 作者
  • memfd.c:40:12: error: static declaration of ‘memfd_create’ follows non-static declaration

    qemu编译安装出错 xff1a memfd c 40 12 error static declaration of memfd create follows non static declaration 修改 xff1a a util m
  • windows10 驱动开发环境 VS2019+WDK10

    windows10 驱动开发环境 1 下载SDK https developer microsoft com zh cn windows downloads windows 10 sdk 通用驱动demo xff1a https githu
  • 在用户配置文件中添加 IDF_PATH 和 idf.py PATH

    在用户配置文件中添加 IDF PATH 和 idf py PATH CMake 英文 注解 本文档将介绍如何使用 CMake 编译系统 目前 xff0c CMake 编译系统仍处于预览发布阶段 xff0c 如您在使用中遇到任何问题 xff0
  • error C3861: “gets”: 找不到标识符

    error C3861 gets 找不到标识 把 gets 改成 gets s 用VS2015打开一个win32工程 xff0c 生成解决方案失败 报错信息 xff1a 命令行 error D8016 ZI 和 Gy 命令行选项不兼容 选中
  • ROS和Optitrack通信

    ROS xff1a indigo Ubuntu xff1a 14 04 目的 xff1a 一台计算机通过Optitrack获得刚体 xff08 crazyflie2 0 xff09 的姿态信息并广播到同一局域网的其他计算机上 xff08 如
  • 运算放大电路(三)-加法器

    加法器 由虚短知 xff1a V 61 V 43 61 0 a 由虚断及基尔霍夫定律知 xff0c 通过R2与R1的电流之和等于通过R3的电流 xff0c 故 V1 V R1 43 V2 V R2 61 Vout V R3 b 代入a式 x
  • 一个嵌入式硬件高手的设计心得

    一 xff1a 成本节约 现象一 xff1a 这些拉高 拉低的电阻用多大的阻值关系不大 xff0c 就选个整数5K吧 点评 xff1a 市场上不存在5K的阻值 xff0c 最接近的是 4 99K xff08 精度1 xff09 xff0c
  • 跟着我从零开始入门FPGA(一周入门系列)第五

    5 同步和异步设计 前面已有铺垫 xff0c 同步就是与时钟同步 同步就是走正步 xff0c 一二一 xff0c 该迈哪个脚就迈那个脚 xff0c 跑的快的要等着跑的慢的 异步就是搞赛跑 xff0c 各显神通 xff0c 尽最大力量去跑 x
  • 硬件原理图设计规范(二)

    1 可编程逻辑器件 编号 级别 条目内容 备注 1 推荐 FPGA的LE资源利用率要保证在50 xff5e 80 之间 xff0c EPLD的MC资源的利用率要保证在50 xff5e 90 之间 对于FPGA中的锁相环 RAM 乘法器 DS
  • 嵌入式Linux应用程序开发-TCP-IP网络通信应用程序

    作为全世界最优秀的开源操作系统 xff0c Linux内部已经集成了强大的网络协议栈 xff0c 并向应用层提供丰富的系统调用 xff0c 开发者可以基于通用的系统调用接口 xff0c 使用Linux内核提供的网络功能 如果要分析Linux
  • STM32“死机“(实用调试技巧)

    2 硬件环境导致 34 死机 34 1 供电电源电压不在合适范围 单片机都需要有一个能够稳定运行的电压工作范围 xff0c 如果低于或者高于正常工作电压范围其单片机并不一定会立马无法工作 也有可能会立马死机 xff0c 而是工作一段时间在某
  • TI的ADS8320使用说明

    在调试程序的过程中遇到一个奇怪的现象 xff0c 使用ADS8320的16位AD采样温度数据 xff0c 在实际使用过程中遇到问题 xff0c 记录如下 xff1a 初始化 ADS8320 拉低片选 读取16位数据 拉高片选 使用STM32
  • [C++] 模板函数声明与实现的分离

    在使用模板时 xff0c 一般要求定义与实现在一起 xff0c 那么为了程序的统一与美观 xff0c 若想在仅在头文件中定义 xff0c 在源文件中实现 xff0c 例如 xff1a span class token comment tem
  • Android List 排序

    Android List lt Point gt 排序 1 按照x来排序 1 1升序 List points xff1b Collections sort points new Comparator 64 Override public i
  • Android反射机制

    Android反射机制实例 创建一个测试类 Person public class Person private String name 61 34 张三 34 private int age 61 15 private String de
  • 将json字符串转换为自定义对象

    将json字符串转换为自定义对象 将json转自定义对象或者List String json 61 34 34 name 34 cece 34 Gson gson 61 new Gson Person person1 61 gson fro
  • 启动一个没有注册的Activity

    废话不多说 xff0c 直接上代码 xff0c 如有不明白的可以私信留言 xff0c 一起进步 在Application 中调用即可 AndroidManifest 中已经有注册过的activity class App extends Ap
  • 将List<Object>集合(汉字、字母、数字)按照拼音来排序

    目录 将List xff1c Object xff1e 集合按照拼音来排序 1 需求 2 使用系统自带的compareTo可以排序汉字 xff0c 如果其中混入了字母 xff08 纯字母 xff09 xff0c 会直接排在汉字之前 xff0
  • 手写findviewbyid和使用注解给变量赋值

    手写findviewbyid和使用注解给变量赋值 使用到注解和反射 注解本身没有什么含义 xff0c 只有配合反射和插桩技术时才能体现价值 我们平时要初始化view都需要调用findviewbyid xff0c 那我们可不可以省去这一步呢