kotlin代替findViewById的方法

Kotlin系列之filter、find、any、map、flatMap、takeWhile、reduce、groupBy常见高阶函数 阅读详情

在安卓项目使用了Kotlin之后,发现Kotlin一个相当强大的地方,可以不用findViewById,引入布局,直接使用控件

方式一:使用kotlin插件自动生成

引入kotlin扩展插件

apply plugin: ‘kotlin-android-extensions’

引入kotlin自动生成的相关布局文件

import kotlinx.android.synthetic.main.activity_main.*

上面,kotlin插件会生成当前项目的布局文件对应的包,引入进来后,直接用布局文件的Id当作控件使用即可,根本不需要findViewById

<TextView
     android:id="@+id/tv_data"
     android:layout_width="match_parent"
     android:layout_height="0dp"
     android:layout_weight="1"
     android:gravity="center" />
 override fun onCreate(savedInstanceState: Bundle?): View? {
      super.onCreate(savedInstanceState)
      setContentView(R.layout.activity_main)
      tv_data.text = "test"//直接使用
}

值得注意的是,以上是在Activity里面使用,在Fragment里面使用必须在onViewCreated方法获取控件,不然会空指针

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                              savedInstanceState: Bundle?): View? {
        mContentView = inflater.inflate(layoutId, container, false)
        return mContentView
} 

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
      super.onViewCreated(view, savedInstanceState)

      tv_text.text = "测试"
}

方式二:利用注解(仅供学习注解使用,推荐方式一)

用过butterknife之类框架的安卓童鞋都应该清楚,它们使用了注解来代替findViewById,从而少了一堆繁琐又不优雅的代码。下面我就介绍下如何利用Kotlin注解实现这样一个简易的功能。

1.kotlin声明注解需要在类前面使用 annotation 关键字

annotation class BindView() {}

2.我们都知道,注解类一般需要指定注解目标类型(Target),注解的可见性(Retention)等(kotlin注解与java完全兼容,不懂的童鞋请先去了解java注解),于是,就有了如下:

@Target(AnnotationTarget.FIELD)
@Retention(AnnotationRetention.RUNTIME)
annotation class BindView(val id:Int = -1) {}

简单说明一下含义:

  • @Target 指定可以用该注解标注的元素的类型(类、函数、属性、表达式等),这里指定为属性(FIELD);
  • @Retention 用来定义该注解在哪一个级别可用,在源代码中(SOURCE)、类文件中(CLASS)或者运行时(RUNTIME)。;

在上面这个注解类的构造函数我们传入了一个id,即控件的id,用于绑定该控件

3.利用反射注入

fun bindView(activity: Activity) {
        try {
            //通过反射获取当前Activity的所有属性
            val fields = activity.javaClass.declaredFields 
            for (field in fields) {
                //判断该属性是否使用自己定义的BindView注解
                if (field.isAnnotationPresent(BindView::class.java)) { 
                    val inject = field.getAnnotation(BindView::class.java) //获得该类上注解
                    val id = inject.id //读取view的id
                    if (id > 0) {
                        field.isAccessible = true
                        field[activity] = activity.findViewById(id) //给view赋值,相当于 view = findviewById(R.id.tv);
                    }
                }
            }
        } catch (e: Exception) {
            e.printStackTrace()
        }
 }

4.在Activity中使用:

@BindView(R.id.tv_data)
private var tvData: TextView? = null

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        
        bindView(this)
}

如何在Fragment中使用呢?同Activity类似,只不过需要多传入一个contentView参数,因为Fragment视图的创建比较特殊

fun bindView(fragment: Fragment, contentView: View) {
        try {
            val fields = fragment.javaClass.declaredFields
            for (field in fields) {
                if (field.isAnnotationPresent(BindView::class.java)) {
                    val inject = field.getAnnotation(BindView::class.java)
                    val id = inject.id
                    if (id > 0) {
                        field.isAccessible = true
                        field[fragment] = contentView.findViewById(id)
                    }
                }
            }
        } catch (e: Exception) {
            e.printStackTrace()
        }
 }

在Fragment中:

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                              savedInstanceState: Bundle?): View? {
        mContentView = inflater.inflate(contentView, container, false)

        //注解绑定视图id
        bindView(this,mContentView)

        return mContentView
  }

Android findViewById及替代方案大全 自打学习Android开发以来,findViewById就是我使用最频繁的函数之一。findViewById可为灵活至极,但是又让人爱恨交加。那findViewById究竟有哪些优缺点,他又有哪些替代方案呢?今天就来做一个总结 findViewById findViewById的原理 findViewById的原理非常简单,我们都知道Android中的View结构是一个树形结构,findViewById就是自树的根节点,依次遍历其子节点,知道找到目标的id。 findViewById的优点 还是先夸夸fi 阅读详情

相关推荐

使用 Kotlin 在 Android 开发中替代 findViewById

在 Kotlin 中,我们可以使用扩展属性、Kotlin Android Extensions 和 View Binding 来替代传统的 findViewById() 方法,从而简化 Android 开发中的视图查找和操作。在传统的 Android 开发中,我们经常需要使用 findViewById() 方法来查找和操作布局文件中的视图组件。幸运的是,在使用 Kotlin 进行 Android 开发时,我们可以使用一些更简洁和类型安全的方法来代替 findViewById()。这样,我们就可以直接使用。

IdcEditor的博客 471

Kotlin-24-findViewById 拜拜

目录 1、kotlin-android-extensions 2、依赖kotlin-android-extensions 3、布局代码 4、Activity代码 5、实现原理 1、kotlin-android-extensions kotlin-android-extensions是kotlin为Android专门提供的扩展插件,它就是实现替代findViewById的强大工具。 ...

Yo.o 1594

kotlin list find函数使用方法

find:查找符合条件的并返回第一个符合该条件的数据,若没有符合条件的则返回null。它跟filter的区别就是,filter返回的是结果集合,而find是找到第一个就返回。findLast:查找符合条件的并返回最后一个符合该条件的数据。find属于Kotlin的高阶函数。

南七小僧的学海无涯 884

【android基础】kotlin之不需要调用findViewById就可以调用对应ui控件

不需要调用findViewById就可以调用对应ui控件

苦苦思索的吃瓜群众博客 2119

蓝桥杯单片机开发实战:Keil环境配置与IAP15F2K61S2头文件设置详解

本文详细讲解了为蓝桥杯单片机竞赛配置Keil开发环境的关键步骤,重点解析了IAP15F2K61S2专用头文件的获取与设置方法。通过使用STC-ISP工具添加芯片型号和头文件,确保编译器能正确识别寄存器,是成功进行单片机编程和竞赛备赛的基础。文中还提供了从软件安装、工程创建到常见问题排查的完整实战指南。

soda5的博客 886

通讯软件002——快速使用modscan进行modbus调试

快速使用modscan进行modbus调试

zhouwl72的博客 1031

kotlin代替findviewbyId的方法

kotlin代替findviewbyId的方法 1.在app.gradle中应用扩展插件 id 'kotlin-android-extensions' 2.在 application.gradle 中引入kotlin扩展插件 classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version"

afufufufu的博客 576

AgentFlow:模块化智能体框架与Flow-GRPO强化学习实战解析

在人工智能领域,大语言模型(LLM)与智能体(Agent)技术正推动着自动化任务处理的发展。其核心原理在于通过规划、执行与反馈的循环,使AI系统能够自主调用工具解决复杂问题。这一技术的价值在于突破单一模型的局限性,实现更可靠的多步骤推理。在实际应用中,智能体框架需要处理搜索、代码执行、数学计算等多种场景。本文聚焦的AgentFlow框架,正是通过模块化设计将智能体拆分为规划者、执行者、验证者和生成者四个专家模块,并引入Flow-GRPO强化学习算法进行流程内优化。该框架在搜索增强与工具调用等任务上展现出显著

weixin_42311427的博客 366

kotlin 代替findViewById的方法

在安卓项目使用了Kotlin之后,发现Kotlin一个相当强大的地方,可以不用findViewById,引入布局,直接使用控件,使用kotlin插件自动生成 在app.gradle中应用扩展插件 在 application.gradle 中引入kotlin扩展插件 classpath “org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version” id ‘kotlin-android-extensions’ ...

afufufufu的博客 653

数据仓库ODS层详解- 功能、设计与最佳实践

数据仓库ODS层是大数据分析的基石,为企业决策提供可靠数据源。本文深入探讨ODS层设计原则、实施要点和最佳实践,涵盖金融、零售等行业应用。重点关注云环境下ODS层部署策略,以及实时数据集成、数据湖技术等创新趋势。文章还分析了数据体量增长、实时性需求等挑战,提供实用解决方案。whether助您构建高效、安全、可扩展的ODS层,为数字化转型奠定坚实基础。#数据仓库 #ODS层 #大数据分析 #云计算 #数据湖

一个8年大数据开发工程师的碎碎念 1万+

(三十九)Flask 多应用架构(Multiple Apps)与 DispatcherMiddleware 实战解析

(三十九)Flask 多应用架构(Multiple Apps)与 DispatcherMiddleware 实战解析

孤寒者的博客 1万+

arcgis runtime for android 100.13.0 入门系列,一、初步引入与运行

这是我来到csdn以来写的第一篇文章,希望能通过文字能把我的学习经过与心得分享给大家。我使用的是Kotlin来编写代码,我将默认各位具有一定的Android编程基础。言归正传,我们接下来要做的第一件事情就是使用AndroidStudio来创建一个空的新项目了 我接下来的操作都是遵循arcgis android官方进行搭建的,读者看到的时候可能已经出了新的版本了,不过应该是小版本,arcgis android主体代码结构应该是不会变的,请放心阅读与搭建 欢迎加入我们的QQ交流群249819194 .

weixin_40807433的博客 6504

Pyinstaller打包为可执行文件编码错误的问题

Pyinstaller打包为可执行文件编码错误的问题 写好的python程序在vscode上运行没有任何问题,将程序利用pyinstaller打包后,运行程序发生了错误。 错误代码 UnicodeDecodeError: ‘utf-8' codec can't decode byte 0xce in position 20-21:invalid cotinuation byte 网上找到的解决方案是: 1.在命令行中输入 chcp 65001 2.按正常方式进行封装 pyinstaller

xuefeng_he的博客 1558

使用Kotlin Android Extensions代替ButterKnife和findViewById

简要介绍 安卓开发中,activity获取xml文件中控件,最开始的方法是findViewById,后来出现了ButterKnife,于是很多项目都改用ButterKnife了.但是随着Kotlin Android Extensions的推出,有更简单的玩法了. 使用方法 app工程顶部添加 apply plugin: 'kotlin-android-extensions' 如果工程本身不是Ko...

蓝不蓝编程 1283

工业4.0必备:C#上位机+数字孪生 生产线实时监控与智能预警系统(工业级实战)

数据割裂:PLC、传感器、工业相机的数据散落在不同系统,想看全局生产状态要切换N个软件,“数据孤岛”导致决策滞后;故障难预判:设备突发故障时,只能停机排查,平均故障响应时间超30分钟,一条生产线停工1小时损失超10万;可视化差:传统监控只有冰冷的数字和2D图表,设备运行状态、生产流程、物料流转无法直观感知,新人上手需3个月才能熟悉产线。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 658

OD图 arcgis曲线制作插件 od图曲线 路径图曲线制作插件 航线图曲线制作插件

在ArcGIS 10.2 中导入节点数据,打开插件,选择输入起始节点和目标节点的节点文件Point,以Name字段(地名)为连接线的起始字段和目标字段,(Input Table File)选择连接关系表格SDLine.csv,(Origin Column 和 Destination Column)为起始节点和目标节点,(Output Path)为输出路径,应选择.gdb数据库路径,否则容易报错,(Chord Coefficient)为连线的曲率,数值越大,曲率越高。运行环境:ArcGIS10.2。...

JData_Engineer的博客 2669

AndroidStudio中使用Kotlin--findViewById

虽然Kotlin已经出来一段时间了,但在Google将Kotlin设置为Android首选开发语言之前,也只是简单了解了一下。 现在准备把以前的一个项目改用kotlin写,也算是一边学一边写。 直接使用了官方提供的侧边栏代码,转换成了kotlin代码,还是遇到了一些问题。 ①忘了怎么操作的,findViewById直接报错了 val toolbar = findViewById(R.id

liuxuebing2010的专栏 8003

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

kotlin中关于findViewById()、启动Activity最佳写法以及定义静态方法和kotlin标准函数写法

文章目录kotlin学习篇(三)关于findViewById()启动Activity的最佳写法 kotlin学习篇(三) 内容来自学习郭霖《第一行代码(第三版)》 关于findViewById() Java中如果不用第三方开源库,例如ButterKnife,则需要对布局文件中所需要用到的控件在Java代码中使用findViewById方法来绑定获取控件的实例。而Kotlin中则不用,直接在activity中使用这个控件的ID就可以了。这是因为使用Kotlin编写Android项目在app/build.g

dondurma的博客 2751

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

IMSL CNL 7.0.0 (x86-64)Crack

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

Kotlin减少findViewById

在Kotlin出来前为了减少 findViewById的使用,用 Butterknife,但每次也需要定义注解,Kotlin出来后可以直接使用xml中定义的id 配置:在项目 build中 apply plugin: 'kotlin-android-extensions' dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbra

千寻 873

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

【53】Kotlin android 插件Kotlin-Android-Extensions代替findViewById

module:app -> build.gradle 添加以下代码 apply plugin: 'kotlin-android-extensions' 布局代码 <?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="

丿灬安之若死 533

android studio 3.0 preview 使用kotlin写android,抛弃findviewbyid

听所使用kotlin就可以不用findviewbyid来找控件了,小生迫不及待的尝试了一下,结果。。。没仔细看官方文档,经验不足,掉坑里了 <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://sc

无心博客 7703

Kotlin告别FindViewById的原理

引子 使用Kotlin引用控件的时候,不用写findViewById,直接用id即可,比如 <?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-au

hanshengjian的专栏 947

你还在用findViewById?3分钟掌握Kotlin视图绑定新姿势

告别繁琐的findViewById!本文详解Kotlin视图绑定的使用场景与核心实现方法,提供清晰的Kotlin视图绑定示例,提升代码安全性和可读性。适用于Android开发新手和进阶者,值得收藏。

QuickTrans的博客 863

Kotlin View Binding,findViewById() 终结者

AS 中如何配置 View Binding 仅需 2 步,简单快速: 1. 配置依赖 安卓扩展是 IntelliJ IDEA 与 Android Studio 的 Kotlin 插件的组成之一,因此不需要再单独安装额外插件。 开发者仅需要在 项目根目录 → app → build.gradle 文件中启用 Gradle 安卓扩展插件即可: apply plugin:'kotlin...

全栈工程师 2278

Kotlin中的kotlin-android-extensions插件如何实现findViewById()

kotlin-android-extensions插件简化了Activity中的代码编写。不用通过findViewById()获取控件的实例了。 这个功能的实现可以通过反编译分析。 现在将以下代码转换为Kotlin字节码,然后通过反编译的方式将他还原为java代码,来观察kotlin-android-extensions插件背后实现原理。 这就是kotlin代码对应的字节码...

手写我对你的温柔 1259

Kotlin重构初体验之告别FindViewById

前言 我希望我的文章不要弯弯绕绕,直接贴代码希望大家可以看得懂,看完文章可以达到学习的第一个里程碑,至于后面原理慢慢的补上就是了,毕竟业务和解决问题优先嘛。 环境以及工具 AndroidStudio3.1.4 效果展示 整体步骤 MainActivity.kt /** * kotlin定位控件方式 * 1.kt中使用xml中Id直接定位控件 * 2.通过父布局id定位到子布局控件 * k...

u013777094的博客 577
上一篇: Kotlin与DataBinding使用注意事项
下一篇: 安卓项目框架搭建:Jetpack+协程+Retrofit
程序猫King
博客等级 码龄14年 5580粉丝 66原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猫King

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值