Android通过注解来初始化控件

2023-05-16

Android通过注解来初始化控件

     对于Android大神的思想与能力我只能膜拜与学习了,这里就从大神哪里学来的通过注解来初始化控件简单的概述一下,省去了那么繁琐的findViewById步骤(找到了还要强转,真心醉了)。

原理

   原理是在Activity加载好后通过找到Activity中使用注解的字段,再通过Java反射的方式,动态的给这个字段设置值。

一、定义注解类ViewId.java

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
 * Created 2015/9/7 Administrator tianzhao
 */
// 表示用在字段上
@Target(ElementType.FIELD)
// 表示是在声明周期运行的
@Retention(RetentionPolicy.RUNTIME)
public @interface ViewId {
	int value() default 0;
}
二、定义BaseActivity.java基础类,在这个类中解析注解类
import android.app.Activity;
import android.os.Bundle;
import java.lang.reflect.Field;

public abstract class BaseActivity extends Activity {

	/**
	 * 返回布局的ID
	 */
	public abstract int getLayoutId();
	/**
	 * 初始化
	 */
	public abstract void init();
	/**
	 * 设置监听
	 */
	public abstract void setListener();
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(getLayoutId());
		autoInjectAllField();
		init();
		setListener();
	}

	public void autoInjectAllField() {
		try {
			Class<?> clazz = this.getClass();
			Field[] fields = clazz.getDeclaredFields();// 获得Activity中声明的字段
			for (Field field : fields) {
				// 查看这个字段是否有我们自定义的注解类标志的
				if (field.isAnnotationPresent(ViewId.class)) {
					ViewId inject = field.getAnnotation(ViewId.class);
					int id = inject.value();
					if (id > 0) {
						field.setAccessible(true);
						field.set(this, this.findViewById(id));// 给我们要找的字段设置值
					}
				}
			}
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		}
	}
}
三、最后就是MainActivity.java了
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends BaseActivity {

	@ViewId(R.id.tv)
	private TextView tv;

	@ViewId(R.id.bt)
	private Button bt;

	/**
	 * 处理一些在onCreate里处理的事情
	 */
	@Override
	public void init() {

	}

	@Override
	public void setListener() {
		tv.setText("TextView注解成功");
		bt.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				tv.setText("Button注解成功");
			}
		});
	}

	@Override
	public int getLayoutId() {
		return R.layout.activity_main;
	}

}
    OK,就是这么简单,通过java的反射机制简化了多少代码,提高了多少开发效率。不过貌似这种方式会对效率有点影响。



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android通过注解来初始化控件 的相关文章

随机推荐

  • 处在八零末期,九零早期,缝隙中的人

    处在八零末期 xff0c 九零早期 xff0c 缝隙中的人 思想既可以与八零年代的人相似 xff0c 又有九零年代那种无法脱掉的稚气 这就是89年 90年出生的人 的特性
  • 马上就下班回家了,让我再写一篇

    马上就下班回家了 xff0c 让我再写一篇 xff0c 写博客让我突然静下来了 同时都纷纷离开了 快了 xff0c 快了 xff0c 马上写好了
  • 我知道自己的未来需要什么

    我知道自己的未来需要什么 xff0c 现在的路就在眼前 xff0c 争取一把 xff0c 奋斗一段时间 xff0c 未来光明坦途正在招手 下班了 xff0c 下次再来
  • 走马观花之《视觉SLAM十四讲》

    1 视觉SLAM 系统概述 SLAM 是Simultaneous Localization and Mapping 的缩写 xff0c 中文译作 同时定位与地图构建 它是指搭载特定传感器的主体 xff0c 在没有环境先验信息的情况下 xff
  • 硬件工程师必会模块之MOS管构成的基本门逻辑电路—看芯片手册框图必备技能

    本文你可以获得什么 xff1f MOS管构成的缓冲器Buffer和漏极开路们OD门是数字电路非常重要的概念 xff0c 怎么构成的 xff1b 反相器 xff0c 线与逻辑怎么玩 xff0c 又怎么用呢 xff1f 根据原理图 xff0c
  • 关于信号量的作用范围

    最近在搞信号量的时候产生了怀疑 xff0c 信号量的作用范围和信号量在任务的位置时候有关系呢 xff1f 答案是有的 xff0c 其实信号量的作用范围是指的从信号量开始到程序的跳转点为止 xff0c 比如一个任务中 xff0c 把信号量放在
  • UNIX 环境高级编程之我见

    UNIX环境高级编程 xff08 第二版 xff09 xff08 人民邮电出版社 xff09 美 W Richard Stevens amp Stephen A Rago 著 本书的主要结构分为以下几个部分 xff1a xff08 1 xf
  • xShell连接ubuntu不成功

    操作环境 xff1a xShell6 43 vm15 43 ubuntu18 04 xShell中以root身份连接虚拟机中的ubuntu时 xff0c 连接不上 xff0c 见下图 xff1a 密码输入的也是对的 xff0c 也能够双向p
  • mac brew install

    brew cask install myprogram base darren 64 Darren 2 project brew cask install docker Error Unknown command cask brew ins
  • mac/linux 系统批量计算文件md5命令

    find type f print0 xargs 0 md5
  • 链表-设计链表

    leetcode 707 设计链表 注意 xff1a 面向对象的思想 这是创建一个自己的链表 xff0c dummyhead和 size初始化都在构造函数中 xff0c 同时自己的链表类也需要定义自己的节点 struct LinkNode链
  • KVM虚拟机使用桥接方式时和宿主机无法通信的解决方案

    KVM虚拟机使用桥接方式时和宿主机无法通信的解决方案 应用场景 虚拟机客户机安装完成后 xff0c 需要为其设置网络接口 xff0c 以便和主机网络 xff0c 客户机之间的网络通信 事实上 xff0c 如果要在安装时使用网络通信 xff0
  • android 电池充电状态记录

    摘抄源码记录下 http androidxref com 9 0 0 r3 xref frameworks native include batteryservice BatteryServiceConstants h This file
  • python 输入三个变量,然后按小到大输出(解析)

    python 实例解析 xff08 1 xff09 vim 2 python py x 61 int input 39 please input x 39 y 61 int input 39 please input y 39 z 61 i
  • Linux系统调用Hook姿势总结

    http www cnblogs com LittleHann p 3854977 html 主题 Linux 相关学习资料 http xiaonieblog com post 61 121 http hbprotoss github io
  • 利用WireShark进行DNS协议分析

    一 准备工作 系统是Windows 8 1Pro 分析工具是WireShark1 10 8 Stable Version 使用系统Ping命令发送ICMP报文 二 开始工作 打开CMD exe键入 ping www oschina net
  • DNS协议详解及报文格式分析

    DNS协议详解及报文格式分析 Posted on 2017 06 18 by Jocent No Comments 目录 一 DNS协议理论知识 1 1 域名结构1 2 域名服务器1 3 域名解析过程 二 DNS协议报文格式 2 1 头部2
  • 解密微信数据库文件解析

    图解说明 xff1a 微信大量数据存储在本地比如 xff1a 联系人 xff08 包含好友地区 电话 通过那种方式添加 xff09 聊天内容 xff08 图片 文字 语音 视频 位置 名片 其他app分享链接 xff09 聊天室 收藏信息
  • qgroundcontrol二次开发环境搭建

    参考考qgroundcontrol官方文档 xff0c 做一些准备工作 xff1a https dev qgroundcontrol com master en getting started index html 1 按官方文档下载qgr
  • Android通过注解来初始化控件

    Android通过注解来初始化控件 对于Android大神的思想与能力我只能膜拜与学习了 xff0c 这里就从大神哪里学来的通过注解来初始化控件简单的概述一下 xff0c 省去了那么繁琐的findViewById步骤 xff08 找到了还要