android 巧妙利用反射机制获取控件id,避免大量冗杂的findviewbyid和butterknife注解

Markdown数学公式完全指南:从LaTeX语法到编辑器实战 LaTeX作为专业的数学排版系统,通过其丰富的符号库和严谨的排版规则,成为学术界和技术文档中公式表达的事实标准。其核心原理在于将数学符号编码为纯文本命令,由渲染引擎(如MathJax或KaTeX)解析为可视化公式,实现了内容与样式的分离。这一技术价值在于极大提升了技术文档的可读性、可维护性和协作效率,尤其在算法推导、数据分析和学术写作等场景中不可或缺。本文聚焦于Markdown环境下LaTeX数学公式的实战应用,系统梳理了常用数学符号的LaTeX语法,并针对VS Code、Obsidian等主流编辑器提供了 阅读详情

android 巧妙利用反射机制获取控件id,避免大量冗杂的findviewbyid和butterknife注解

一、反射机制概述
Java 反射机制是在运行状态中,对于任意一个类,都能够获得这个类的所有属性和方法,对于任意一个对象都能够调用它的任意一个属性和方法。这种在运行时动态的获取信息以及动态调用对象的方法的功能称为 Java 的反射机制。

Class 类与 java.lang.reflect 类库一起对反射的概念进行了支持,该类库包含了 Field,Method,Constructor 类 (每个类都实现了 Member 接口)。这些类型的对象时由 JVM 在运行时创建的,用以表示未知类里对应的成员。

这样你就可以使用 Constructor 创建新的对象,用 get() 和 set() 方法读取和修改与 Field 对象关联的字段,用 invoke() 方法调用与 Method 对象关联的方法。另外,还可以调用 getFields() getMethods() 和 getConstructors() 等很便利的方法,以返回表示字段,方法,以及构造器的对象的数组。这样匿名对象的信息就能在运行时被完全确定下来,而在编译时不需要知道任何事情。

简单无脑直接上代码。

package com.example.zsh.reflect_idtest;

import android.app.Activity;
import android.content.res.Resources;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Button mbtn_ok;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        smartInject();
    }

    @Override
    public void onClick(View v) {

        switch (v.getId()) {
            case R.id.mbtn_ok:
                Toast.makeText(this, "dsadxsa", Toast.LENGTH_SHORT).show();
                break;
        }
    }

    /**
     * 使用java反射机制
     * 设置Activity不用findViewbyid
     */
    private void smartInject() {
        try {
            Class<? extends Activity> clz = getClass();

            while (clz != BaseActivity.class) {
                Field[] fs = clz.getDeclaredFields();
                Resources res = getResources();
                String packageName = getPackageName();
                for (Field field : fs) {
                    if (!View.class.isAssignableFrom(field.getType())) {
                        continue;
                    }
                    int viewId = res.getIdentifier(field.getName(), "id", packageName);
                    if (viewId == 0)
                        continue;
                    field.setAccessible(true);
                    try {
                        View v = findViewById(viewId);
                        field.set(this, v);
                        Class<?> c = field.getType();
                        Method m = c.getMethod("setOnClickListener", View.OnClickListener.class);
                        m.invoke(v, this);
                    } catch (Throwable e) {
                    }
                    field.setAccessible(false);

                }
                clz = (Class<? extends Activity>) clz.getSuperclass();
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/mbtn_ok"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Hello World!" />

</LinearLayout>

这里需要注意的是 布局文件ID 和 全局变量声明的ID还有 onClick的ID要一致,否则无法获取到点击事件,这或许是利用反射避免findviewbyid的一种弊端吧。
 

Android 获取控件id的三种方式 前言: 获取控件是入门的基本的,相信这个不用说就知道怎么得到资源文件中的控件id 有findViewbyid 有注解方式 反射的方式 通过findViewbyid获取 原理 我们点击进入Activity.java类中看源码,通过源码我们发现返回的是getWindow.findViewById,这个window是什么呢?我们再次点击进去看看, ··· /** * Find... 阅读详情

相关推荐

Mac---安装Navicat

把这个填充好的字符串放入刚才打开的RSA在线加解密的网站中的第二个框框(替换之前的请求码),第一个框框不动(还是之前第10步骤中的私钥),点击RSA私钥加密,这时会得到一个加密的字符串,这个就是激活码。{“K”:“你的K值”, “N”:“52pojie”, “O”:“52pojie.cn”, “DI”:“你的DI值”, “T”:你的时间戳}链接: https://pan.baidu.com/s/1mEVY4hnKdktg-p7DBIfD7A 提取码: twwg。Navicat会弹出一个对话框,点击“注册”

weixin_53970868的博客 1万+

Android 反射获取控件

ProgressDialog mBootMsgDialog = new ProgressDialog(mContext); try { Field file = ProgressDialog.class.getDeclaredField("mMessageView"); // 通过反射获取item_tv对象 file.setAccessible(true); //私有变量需要使用此方法 TextView textView = (TextView) file.get(mBootMsg.

newhand1的博客 3202

三维重建笔记_光束平差法(Bundle Adjustment, BA)

目录 1 光束平差法(Bundle Adjustment, BA) 1.1 SFM (Structure‐from‐Motion) 定义 问题描述 1.2 重投影误差 (Reprojection Error) 目标函数 1.3 使用 Levenberg‐Marquardt Algorithm 进行优化 问题描述 简化目标函数 参考 Gauss‐Newton Method ...

惊鸿一博 2万+

android获取控件的id(标识符)-根据控件id获取对应的值或控件名字-动态获取R.string的值

项目中需要动态获取资源R.string的值,记录一下解决方案。 直接先上个示例,下面再有详细解说: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); for(int i=0;i<7;i++){

ruiruiddd的博客 1万+

APO的全面进化之路(2):走向IBP、建设端到端供应链计划体系

前一篇记录阐述了在供应链计划(Supply Chain Planning)领域里SAP的关键产品APO的不断进化之路,即部分产品从APO进化到S/4HANA,本篇将继续阐述进化之路上的另一大中坚产品力量SAP-IBP(Integrated Business Planning)。作为SAP数字化供应链(Digital Supply Chain)中供应链计划SCP的左膀右臂,S/4HANA与IBP共同完善了计划域的完整闭环。本篇作为收尾,在先谈对IBP产品的个人认知之前,特别是在当今这个IT产品迭代多、技术革新

ChampaignWolf的专栏 5230

linux安装配置Mysql详细步骤

下载Mysql rpm包 官网下载:https://dev.mysql.com/downloads/mysql/ 如果你到了这里,本地应该有了如下四个rpm包: mysql-community-client-5.7.26-1.el6.x86_64.rpm mysql-community-common-5.7.26-1.el6.x86_64.rpm mysql-community-libs-5...

🏆 前端领域优质创作者 7万+

【Android 插件化】Hook 插件化框架 ( 反射工具类 | 反射常用操作整理 )

Android 插件化系列文章目录、 前言、 一、成员变量、 二、反射工具类入口方法、 三、反射 Field 相关方法、 1、反射 Field 字段、 2、反射获取 Field 对应实例、 3、反射设置 Field 对应实例、 四、反射 Method 相关方法、 1、反射 Method 方法、 2、反射调用 Method 方法、 五、完整反射工具类代码示例、 六、博客资源、

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 1580

【WorkBuddy专栏19】技能的创造与迁移——从零开始打造你的AI工作流

【WorkBuddy专栏19】技能的创造与迁移——从零开始打造你的AI工作流

AI人人懂 373

android 根据控件的ID字符串利用反射获取UI控件

应用场景:如果我们想获取某个自定义View里面的某个控件,知道里面的控件ID以后可以通过以下方法获取。 比如获取搜索框自定义组件里面的EditText //通过反射获取 et_search 控件 try { //也可以通过以下方法获取类 // Class stuClass = Class.forName("控件报名"); ...

韦大人orz 1421

AD9613操作控制

输出250M时钟给AD9613,过FPGA ILA逻辑分析仪将AD9613采集的两个通道ADC数据250M数据显示出来。其中AD9613输出的是LVDS数据,通过select IO核转为并行数据。 一,搜索IP核:selectIO interface wizad ,并双击配置 配置为input,DDR模式,数据位宽为12bit,IO类型为差分,这里配置的是12对数据差分对。然后配置外部差分时钟。 将tap setting 设置为13,将时钟的边沿对准数据的中间,以免数据出错 二,

wangjie36的博客 4048

双像素传感器的AI计算摄影实战:单目深度估计与图像去模糊的融合创新

本文介绍了双像素传感器技术在计算机视觉中的应用,包括深度估计、图像去模糊和图像重建等任务。双像素传感器通过两个子单元捕捉视差信息,使摄像头能够分析场景的三维结构和运动轨迹。文章以图像去模糊为例,详细展示了从数据准备到模型训练的完整流程,包括构建自定义数据集、设计双像素特征提取模块、训练去模糊模型及推理测试。通过模拟双像素的"双视角"信息融合,该AI算法能有效恢复模糊图像的清晰细节。

know_F0727的博客 256

Android 反射获得控件对象

例: @ViewInject(R.id.pull_to_refresh_listview) private PullToRefreshListView pullToRefreshListView;不再使用一下代码初始化 pullToRefreshListView = (PullToRefreshListView) findViewById(R.id.pullToRefreshListVi

Anykaa_FD 4526

基于 OpenCVSharp 的晶圆缺口自动检测与旋正方案

在半导体制造过程中,晶圆(Wafer)需要精确定位才能进行后续加工。每个晶圆边缘都有一个特定的缺口,这个缺口就像 "箭头" 一样,帮助机器确定晶圆的方向。我们的任务就是通过摄像头拍摄的图片,自动找到这个缺口的位置,计算出需要旋转多少角度才能让晶圆对准正确方向。简单来说,这个技术就像给晶圆 "找方向",确保它在生产线上始终保持正确的姿态。

品质生活,极致编程。 1211

android通过反射代替R来获取控件对象

在android里通过xml布局文件寻找某个控件时,我们通常做法是通过R文件来指向 如: findById(R,id.xx); 但其实还有另外一种方法来获取控件 》》反射 如 : name : id的命名 findById(context.getResource().getIdentifier(name,"id",context.getPackageName));

a2855090的专栏 2930

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Android中用反射获取View

延伸阅读: 巧妙利用反射机制得到ListView中的view 我们在使用ListView的时候,经常会使用的ViewHolder方式作为缓存,每次都需要手动的通过viewholder.icon = convertview.findVIewByid(id);一般的app都会有好几个页面会用到ListView,这样的话我们的代码量就会很大,有没有好点的办法呢,其实今天学习了反射机制,利用所有的控件的超类都是View这个特点,循环给ViewHolder里边的控件赋值,下边是具体代码: pu...

Dream It Possible 2401

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Android反射+注解获取控件ID

我们还是能接受这个方法去得到对应的ID,但是一旦我们的控件比较多的情况下就会写很多代码去  拿到对应的ID了,为了节省内存空间,我们可以通过反射+注解来拿到我们所有控件所对应的ID MainActivity.java public class MainActivity extends AppCompatActivity { @Viewid(R.id.tv)

W2316的博客 1269

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Android-反射+注解获取控件ID

Android-反射+注解获取控件ID通常我们最常规的方法就是通过findViewById这个方法拿到每个我们所定义控件的ID,对于一两个控件 来说,我们还是能接受这个方法去得到对应的ID,但是一旦我们的控件比较多的情况下就会写很多代码去 拿到对应的ID了,为了节省内存空间,我们可以通过反射+注解来拿到我们所有控件所对应的IDMainActivity.javapublic class MainA

GodV的博客 4527

Android:两种通过反射机制获取方法的使用实例

Android:两种通过反射机制获取方法的使用实例

OohYaYaXXXXD的博客 989

android中简单的反射操作

这里的反射只是一个简单的操作,方便自己以后小看一下操作前 ,首先要有这个类的源码在文件中,因为这个类的方法可能是@hide(隐藏)的,所以不能直接获得,需要用反射来获得。 直接代码… 这是想要用到该类的方法 public class Infos { public String getNum(String num ){ return num ; } } 然后就是如何使

ButtonXin的博客 729

Android 使用反射获取系统ID值 com.android.internal.R.id.*

在需要改变系统默认效果样式的时候,可以通过findViewById的方式获取到系统UI控件。 有时需要用到: com.android.internal.R.title com.android.internal.R.icon 普通应用(非系统级应用)是无法直接访问到com.android.internal.R.id.*属性的,此时就需要使用反射来实现了。

a day a better 3074

利用反射 获取android布局文件中设置的属性值

private void initSystemAttrs(Context context, AttributeSet attrs) { if (attrs == null) { return; } Class<?> clazz = ReflectUtils.getClass("com.android.internal.R$sty

学习专栏 1064

android 利用反射和注解绑定控件id和点击事件

本文介绍了一个基于Java反射和注解的Android控件绑定工具类。通过定义@ViewId和@Onclick两个注解,分别用于绑定控件ID和点击事件。ViewUtil工具类支持Activity、Fragment和View三种组件的控件绑定,通过反射自动完成字段赋值和事件监听设置。该方案简化了传统findViewById和setOnClickListener的重复代码,提高了开发效率。使用时只需在字段和方法上添加相应注解即可自动完成绑定,适用于各种Android视图组件。

u012116089的博客 223

Android利用资源名称获取其ID(二)--->反射

MainActivity如下: package cn.testreflect; import java.lang.reflect.Field; import android.os.Bundle; import android.widget.ImageView; import android.app.Activity; /** * Demo描述: * 依据图片的名字,通过反射获取其在drawa

谷哥的小弟 2347

android获取layout实例,【Android进阶学习】LayoutInflater的应用

LayoutInflater在Android中是“扩展”的意思,作用类似findViewById( ),它在Android开发中的作用是很大的。LayoutInflater经常在BaseAdapter的getView方法中用到,用来获取整个View并返回。LayoutInflater与findViewById( )的不同点:LayoutInflater是将XML中的Layout转换为View放入....

weixin_39860849的博客 742
上一篇: android 判断是否有网络工具类
下一篇: android 自定义封装android 6.0以上动态权限添加工具类
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值