首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Android Studio 3.6中使用视图绑定替代 findViewById的方法

(binding.root) } △ Activity 中使用视图绑定 使用视图绑定时,无须再调用 findViewById 方法,只要直接调用绑定对象中的对应属性即可。...一个常见的错误用法是: 开启了视图绑定的同时,依然 setContentView(…) 中传入布局的 id 而不是绑定对象。这将造成同一布局被填充两次,同时监听器会被添加到错误的布局对象中。...安全: 视图绑定会检测某个视图是不是只一些配置下存在,并依据结果生成带有 @Nullable 注解的属性。所以即使多种配置下定义的布局文件,视图绑定依然能够保证安全。...这意味着您的修改立即反映在绑定对象中,而无须等待或者重新构建工程。 Android Studio 被优化为可以您编辑过 XML 布局文件后立即更新绑定对象。...△ 视图绑定安全、只引用当前布局中的视图、支持 Java 和 Kotlin,同时更简洁 上图为对比视图绑定、ButterKnife 和 Kotlin 合成方法的功能。

2.4K31

使用视图绑定替代 findViewById

(binding.root) } △ Activity 中使用视图绑定 使用视图绑定时,无须再调用 findViewById 方法,只要直接调用绑定对象中的对应属性即可。...一个常见的错误用法是: 开启了视图绑定的同时,依然 setContentView(...) 中传入布局的 id 而不是绑定对象。...这将造成同一布局被填充两次,同时监听器会被添加到错误的布局对象中。...安全: 视图绑定会检测某个视图是不是只一些配置下存在,并依据结果生成带有 @Nullable 注解的属性。所以即使多种配置下定义的布局文件,视图绑定依然能够保证安全。...△ 视图绑定安全、只引用当前布局中的视图、支持 Java 和 Kotlin,同时更简洁 上图为对比视图绑定、ButterKnife 和 Kotlin 合成方法的功能。

1.6K30
您找到你想要的搜索结果了吗?
是的
没有找到

Android完美解析setContentView 你真的理解setContentView吗?「建议收藏」

导读: 本篇文章的前半部分为源码分析,后半部分为一个例子,例子中我们遇到一些问题,从而回答前半部分留下的问题!...(); } 点进来之后我们发现它里边调用了getWindow.setContentView,我们点击getWindow看看里面是什么!...当mContentParent为的时候,执行installDecor()方法,那么我们肯定是到installDecor中去找答案咯,点进去!...如果为空说明我们还没有DecorView,然后调用installDecor,之后我们的DecorView就准备好了,mContentParent指向了我们的ContentView,由于是新建的,我们的...例子: 我们现在就来模拟一个需求,比如用户MainActivity填写一个表单,这个表单有姓名和电话两个字段,当用户填完之后我们要进行提交,但是提交之前我们希望有一个确认表单的页面来让用户确认一下信息是否填对

1.2K30

【Android】Handler 使用

用它可以发送消息,可以用它处理消息。Android开发中有着非常重要的地位。 0x12 为什么要使用Handler 当一个应用程序运行时,它会创建一个进程。...当使用Message对象在线程间传递消息时,如果它包含一个Parcelable的结构类(不是由应用程序实现的类),此字段必须为非(non-null)。...如果Bundle对象不存在返回null。 public Bundle getData():获取附加在此事件的任意数据的Bundle对象,需要时延迟创建。...非静态(匿名)内部类持有外部对象,当我们这样重写Handler时它就成为了一个匿名内部类,这样如果调用finish方法时Handler有Message未处理的话,就会导致Activity不能被销毁。...可以同时使用静态内部类和弱引用,当一个对象只被弱引用依赖时它便可以被GC回收。

88220

android学习笔记----关于findViewById那些事

当你点击设备的应用图标 就打开了 MainActivity,我们的代码中 MainActivity 的 onCreate 方法被系统调用,在这个方法中有一个 setContentView 方法,它是资源布局...为了应用运行时能与这些视图进行交互并且修改它们,例如修改文本或者修改按钮,那么我们需要找到 Java 对象,一旦我们找到它们,我们可以 MainActivity 中用引用指向它们,记住,我们没有创建新的...之后我们可以 Java 代码中引用它们了。...但是我们还是不知道如何建立变量和具体的 Java 对象之间的联系,对于这个变量和 Java 对象 情况也是如此,AppCompatActivity 类中,有一个具体的方法就是调用 findViewById...这就意味着 activity 代码中 我们可以调用 findViewById传入我们所需 View 的资源 id,然后它就会返回一个 View 对象,我们就可以把它当做变量存在 activity 中(

29310

Android异步消息机制详解

之后该消息会被添加到MessageQueue中等待被处理,而Looper一直尝试从MessageQueue中取出待处理消息,最后分发回Handler对象中的handleMessage()方法中。...原因是: 第一:当我们通过Handler对象的sendMessage()方法发送一个Message对象时,该Message对象持有对该Handler对象引用(正是依靠这个引用,Looper消息队列中取出该...以上两个结合在一起,问题就来了:Message对象持有Handler对象引用,Handler对象持有MainActivity的引用。...如果Message对象子线程中被发送至消息队列,然后一直没有被处理,该活动所在的主线程一直挂着,而不会被内存回收。所以,导致内存泄露。 知道了原因,那么解决方法是什么?...对于这种使用了静态内部类来避免内存泄露,同时又需要调用外部类的方法的情况:可以使用弱引用!即我们该内部类中声明一个对外部类对象的弱引用。这样即可以调用外部类的方法,又不会导致内存泄露。

1.5K10

Android开发笔记(七十五)内存泄漏的处理

内存泄漏的原因 一直以来以为只有C/C++才存在内存泄漏的问题,没想到拥有内存回收机制的Java可能出现内存泄漏。...不过即使不重用适配,仅仅造成当前页面的内存浪费;一旦用户离开该页面,原列表页面的内存就统统回收。所以严格来说,这种情况不是真正意义的内存泄漏,只是内存管理不善造成的内存浪费。...重用适配可先判断convertView,如果该对象,则分配视图对象,并调用setTag方法保存视图持有者;如果该对象,则调用getTag方法获取视图持有者。...实测发现,即使recycle存在内存泄漏,只是没recycle的话泄露有十倍。比如recycle之后,内存仍泄漏40K;但是如果没有recycle,那么内存泄漏有400K。...为解决该问题,构造Handler类时就得初始化目标的弱引用,弱引用不同于前面的引用(强引用),弱引用相当于一个指针,指针指向的地址随时可以回收,这又带来一个新问题,就是弱引用指向的对象可能是的。

1K20

Android视图绑定ViewBinding的使用

概述 我们的开发过程中,需要获取XML布局文件中的ViewId,以便其赋值显示,我们习惯使用findViewById进行操作,可这样导致很多的模版代码出现。...如下图所示: 在这里插入图片描述 使用此生成类引用XML布局文件中的控件 调用生成类ActivityDescriptionBinding的inflate()方法获得类实例对象,通过getRoot()方法可以获得...TextView错误的赋值给一个Button变量,都会报错,这一错误很容易出现,关键错误出现在运行时,而不是编译时!...就是我们访问那个View的时候它不存在。为什么会出现这种情况呢?例如不小心使用了错误的Id,或者访问的时候那个view还不存在。...相比较于 findViewById 和 Butter Knife两种方式还是方便很多的。而且 ViewBinding 使用的过程中不存在类型转换以及指针异常的问题。

2.5K10

Android视图绑定ViewBinding的使用

概述 我们的开发过程中,需要获取XML布局文件中的ViewId,以便其赋值显示,我们习惯使用findViewById进行操作,可这样导致很多的模版代码出现。...如下图所示: [6zaktkd4l5.png] 使用此生成类引用XML布局文件中的控件 调用生成类ActivityDescriptionBinding的inflate()方法获得类实例对象,通过getRoot...,例如不小心将一个TextView错误的赋值给一个Button变量,都会报错,这一错误很容易出现,关键错误出现在运行时,而不是编译时!...就是我们访问那个View的时候它不存在。为什么会出现这种情况呢?例如不小心使用了错误的Id,或者访问的时候那个view还不存在。...相比较于 findViewById 和 Butter Knife两种方式还是方便很多的。而且 ViewBinding 使用的过程中不存在类型转换以及指针异常的问题。

2.7K20

Android 关于内存泄露,你必须了解的东西

前言 内存管理的目的就是让我们开发过程中有效避免我们的应用程序出现内存泄露的问题。内存泄露相信大家都不陌生,我们可以这样理解:「没有用的对象无法回收的现象就是内存泄露」。...如果程序发生了内存泄露,则会带来以下这些问题 应用可用的内存减少,增加了堆内存的压力 降低了应用的性能,比如触发更频繁的 GC 严重的时候可能导致内存溢出错误,即 OOM Error OOM 发生在...sample = new Sample(MainActivity.this); 被弱引用关联的对象只能存活到下一次垃圾回收之前,也就是说即使 Sample 持有 Activity 的引用,但由于 GC...帮我们回收相关的引用,被销毁的 Activity 会被回收内存,这样我们就不用担心会发生内存泄露了。...解决方法:集合元素使用之后从集合中删除,等所有元素都使用完之后,将集合置

1.1K10

Android 进阶解密笔记-热修复

常见的内存泄漏 单例造成的内存泄漏 单例Android中经常使用,如果使用不当造成内存泄漏,因为单例的静态特性使得他的生命周期与应用的生命周期一样长,这就造成当前对象的生命周期比单例短,单例又持有该对象引用...Activity中调用的,然后关闭该Activity则会出现内存泄漏。...解决方案: 静态内部类+弱引用 将Handler的子类设置成 静态内部类,并且可加上 使用WeakReference弱引用持有Activity实例 原因:弱引用对象拥有短暂的生命周期。...而垃圾回收器不管内存是否充足都会回收弱引用对象。...Activity onDestroy 或者某类生命周期结束之后一定要 unregister 或者 close 掉,否则这个 Activity 类会被系统强引用,不会被内存回收。

38220

Android 内存泄漏

常见的内存泄漏 单例造成的内存泄漏 单例Android中经常使用,如果使用不当造成内存泄漏,因为单例的静态特性使得他的生命周期与应用的生命周期一样长,这就造成当前对象的生命周期比单例短,单例又持有该对象引用...Activity中调用的,然后关闭该Activity则会出现内存泄漏。...解决方案: 静态内部类+弱引用 将Handler的子类设置成 静态内部类,并且可加上 使用WeakReference弱引用持有Activity实例 原因:弱引用对象拥有短暂的生命周期。...而垃圾回收器不管内存是否充足都会回收弱引用对象。...Activity onDestroy 或者某类生命周期结束之后一定要 unregister 或者 close 掉,否则这个 Activity 类会被系统强引用,不会被内存回收。

1.9K30

Android开发笔记(一百一十九)工具栏ToolBar

3、把project.properties中的target改为23(注意库工程和app工程都要改),不然会出现如下错误: Error:Error retrieving parent for item:...2、基于一点,新控件可取到SearchAutoComplete的对象,因此我们可给该对象注册自动完成的字符串适配器,在用户输入文字时,界面会自动弹出符合搜索条件的关键词列表; 3、setAppSearchData...Toolbar运行问题处理集锦 更换导航栏还是存在一些兼容问题的,下面是博主发现的几个情况及其解决办法: 1、溢出菜单的菜单项已经设置为android:showAsAction="ifRoom",但即使工具栏还有空间...,该菜单项不会显示工具栏。...getActionView方法获取SearchView对象时,发现取到的SearchView为

1.8K30

Android内存泄漏的原因、解决办法以及如何避免

某些罕见的情况下,泄露的类甚至可以逗留很长时间来接收已注册的回调,这会导致一些非常奇怪的错误,并往往抛出臭名昭著的IllegalStateException异常。...如果没有调用注销方法,被引用对象已经被终止后,监听实例可能持有该对象很长的时间,从而导致泄漏内存。...Android中,如果该对象是一个Activity对象,是特别麻烦的,因为他们往往拥有大量的数据。让我告诉你,可能是什么样子。...内部类 内部类Java中是一个很常见的数据结构。它们很受欢迎,因为它们可以以这样的方式来定义:即只有外部类可以实例化它们。很多人可能没有意识到的是这样的类持有外部类的隐式引用。...匿名类 这种类型的类和内部类有同样的缺点,即他们持有外部类的引用。如同内部类,一个匿名类Activity生命周期之外执行或在其他线程执行工作时,可能导致内存泄漏。

1.9K10

Kotlin扩展函数与实现机制探索

3.1 当发生继承时,扩展函数由于本质是静态方法,它会严格按照参数类型去执行调用,而不会去优先执行或者主动执行父类的方法,如下的例子所示: open class A class B:A() fun...3.3 Kotlin严格区分了可能为和不为的入参类型,同样应用在扩展函数的中,为了声明一个可能为的接受者类型,可以参考如下例子: fun MutableList?....()是一个定义类G内部的扩展函数,在这个扩展函数里,我们直接使用Int类型作为接受者类型,因为我们将扩展函数定义了类的内部,即使我们设置访问权限为public,它也只能在该类或者该类的子类中被访问,...如果我们设置访问权限为private,那么子类中不能访问这个扩展函数。...5.2 Android View 胶水代码 回到最开始的例子,对于Android开发来说,对findViewById()这个方法一定不会陌生,为了获取一个View对象,我们总得先调用findViewById

2.3K72

你还在把Java当成Android官方开发语言吗?Kotlin了解一下!

3.1 当发生继承时,扩展函数由于本质是静态方法,它会严格按照参数类型去执行调用,而不会去优先执行或者主动执行父类的方法,如下的例子所示: open class A class B:A() fun...3.3 Kotlin严格区分了可能为和不为的入参类型,同样应用在扩展函数的中,为了声明一个可能为的接受者类型,可以参考如下例子: fun MutableList?....()是一个定义类G内部的扩展函数,在这个扩展函数里,我们直接使用Int类型作为接受者类型,因为我们将扩展函数定义了类的内部,即使我们设置访问权限为public,它也只能在该类或者该类的子类中被访问,...如果我们设置访问权限为private,那么子类中不能访问这个扩展函数。...5.2 Android View 胶水代码 回到最开始的例子,对于Android开发来说,对findViewById()这个方法一定不会陌生,为了获取一个View对象,我们总得先调用findViewById

67630

“终于懂了“系列:Jetpack AAC完整解析(五)DataBinding 重新认知!

1.1.1 DataBinding 以前 DataBinding 出现以前,想要改变视图 就要引用该视图: TextView textView = findViewById(R.id.sample_text...App内页面和控件数量繁多,一个控件可能多处调用,这就会有出现指针的可能,那如何完全避免呢?...而user是否为 DataBinding自动处理:表达式 @{user.name} 中,如果 user 为 Null,则为 user.name 分配默认值 null。...所以 DataBinding 的本质就是 终态数据 与 UI控件 的绑定,具有以下优势: 无需多处调用控件,原本调用的地方只需要set数据即可 1的延伸,无需手动判 1的延伸,完全不用写模板代码 findViewById...过程中阅读了大量 相关优秀的文章 ,学习到了不同的观点。虽然整个系列是经过 阅读源码、实际使用、阅读其他优秀文章 之后输出的,但不免出现错误和遗漏,欢迎大家 留言讨论。

1.4K10

锦囊篇|一文摸懂ButterKnife

app下的build.gradle的dependencies中进行引入,当然高版本容易出现问题。...源码分析 使用ButterKnife的时候其实我们是否注意到一个问题,我们一定需要写一个这样的一段代码。 ButterKnife.bind(this); 如果不写会出现下方这样的错误。...Override public void onClick(View v) { } }); } 我们能够发现没有加入这句的话的代码出现对象的情况...文件不多,那我们可以一个个看,但是每次看之前我们都要明确一个目标,当然这是我的一个猜测,他应该要对注解进行一个收集,然后再进行一个源码的生成,而且这个文件中,可能会出现几个如下的特征: (1)输出的时候会出现一个后缀...(3)编译时就会调用到的一个注解 ButterKnifeProcessor中我们发现了一个注解@AutoService(Processor.class)说明了这个文件,而这个注解就是为了编译时进行加载的

77740

Toast问题深度剖析(二)

Android 系统似乎意识到了这一点,新版本的系统更新中,限制了很多在桌面提示窗口相关的权限。所以,从体验考虑,这个情况并不属于问题。 “那么我们可以选择哪些窗口的类型呢?”...但是, setContentView 函数需要我们主动调用,如果我并没有调用这个 setContentView 函数,installDecor 方法将不被调用。...当然有,除了 setContentView 函数中调用installDecor外,还有一个函数调用到了这个,那就是: //code PhoneWindow.java @Override public...是不是 WindowManager.addView 之后呢?我们 onResume之后调用Activity.makeVisible,里面会调用 WindowManager.addView。...,我们 WindowManager.addView 之后并没有绘制界面。

4.9K124
领券