原始的Java 代码 ? Java 转 Kotlin 工具 ?...14.1.2 创建基于 Kotlin 的Android 项目 首先新建项目。...Kotlin Android Extensions 插件是 Kotlin 针对 Android 开发专门定制的通用插件, 通过它我们能够以极简的无缝方式实现从 Activity, Fragment 和...View 布局组件中创建和获取视图 View 。...onCreateView() —— 创建fragment中的视图的时候,调用这个方法。
声明式 UI,通过对比可以看到 Kotin DSL 有诸多好处: 有着近似 XML 的结构化表现力 较少的字符串,更多的强类型,更安全 可提取 linearLayoutParams 这样的对象方便复用...另外 Compose 里的代码基本都是可以被混淆的,所以开启混淆之后代码的压缩率也很高。 手动操纵视图会提高出错的可能性。如果一条数据在多个位置呈现,很容易忘记更新显示它的某个视图。...它允许您在应用程序中创建水平滑动的页面布局,类似于 ViewPager 或 RecyclerView。...它控制了视图在屏幕上的显示顺序。具有较高 zIndex 值的视图将显示在具有较低 zIndex 值的视图之上。 默认情况下,视图的 zIndex 值为0。...副作用操作通常包括异步任务、网络请求、数据库操作或其他可能会阻塞主线程的操作。 LaunchedEffect 函数是一个协程构建器,它接受一个或多个参数,并在代码块中执行异步操作。
(DOM是一种文档对象模型,他的层次结构是除了顶级元素,所有元素都被包括到另外的元素节点中,有点像家谱树结构,很典型的就是html代码解析) 到这里,一个有完整view结构的DecorView就创建出来了...."); } } 可以看到是因为当前线程currentThread不是mThread的时候,就会崩溃,报的错误是 “只有创建视图层次结构的原始线程才能触摸它的视图” ,看到这里是不是猜到一些了...,这个mThread难道就是“创建视图的原始线程”?...翻译的还是比较准确的,只有创建视图的原始线程才能修改这个视图,听起来也蛮有道理的,我创造了你才有权利改变你,有那味了。...setText方法中调用了TextView的setText()方法,然后由于Toast中的TextView宽高都是wrap_content的,所以会触发requestLayout方法,最后会调用到最上层
前言 原始方式 在我们的开发过程中,需要获取XML布局文件中的ViewId,以便其赋值显示,我们习惯使用findViewById进行操作,可这样会导致很多的模版代码出现。...ViewBinding和Kotlin扩展 ViewBinding 和 Kotlin 扩展 都是 Android 开发中常用的技术,用于简化视图查找和绑定的过程。...ViewBinding 可以生成类型安全的代码,避免了手动查找和强制转换视图对象的麻烦。 ViewBinding 不会增加 APK 大小,因为它只是编译时生成的代码。...Kotlin扩展 使用起来相对简单,可以直接在布局文件中使用 Kotlin 扩展函数来查找和操作视图。...Kotlin扩展 对视图的数据获取和类型安全性没有提供直接的支持,需要手动处理可能的空指针异常和类型转换。 Kotlin扩展 会增加 APK 的大小,因为它是在运行时动态添加的函数。
1.1 按钮Button Button是Android常用的控件之一,我在前面的文章就提到过Button Kotlin学习日志(一)TextView、Button、Toast的使用 我们看一下使用的代码...只不过由于多数情况用不到视图对象,因此在Kotlin中把冗余的视图入参给省略了,但是为了弄清楚按钮事件的来龙去脉,还是有必要观察一下它的本来面貌,接下来依次介绍按钮事件的三种Kotlin编码方式:匿名函数...此时的函数体代码中还有两个值得注意的地方: (1)因为视图View是基本的视图类型,并不存在文本属性,所以需要把这个视图对象的变量类型转换为按钮Button,然后才能得到按钮对象的文本,Kotlin中的类型转换通过关键字...单选按钮RadioButton默认是未选中状态,点击它则显示选中状态,但是再次点击并不会取消选择,只有点击同组的其他单选按钮,原来选中的单选按钮才会被取消选中。...通过setInputType方法,可以过滤合法的输入字符,只有符合输入类型的字符,才允许接收并显示出来,而Kotlin可以直接给inputType属性设置输入类型,从而取代setInputType的方法调用
虽然 RecyclerView 的组成结构乍一看有些复杂,但是深入理解以后您会发现它其实非常简单明了。 本文会通过创建一个简单的 RecyclerView 实现一个列表来显示不同种类的花的名字。...RecyclerView 是一个容器,它用于显示列表形式 (list) 或者网格形式 (grid) 的数据,比如文本或者照片。 当列表滑动的时候,实际上只有少量邻近的视图会显示在屏幕上。...当视图滑出屏幕时,RecyclerView 会复用它并且填充新的数据。由于它是通过回收已有的结构而不是持续创建新的列表项,所以它可以有效提高应用的时间效率和空间效率。...首先在 Android Studio 里创建一个工程,并且使用 Empty Activity 模板。设置项目名称,并且选择 Kotlin 作为项目所用的语言。...在 ViewHolder 中,创建一个变量来引用 TextView,然后将它指向表项布局里对应的视图。
Anko是一个 Kotlin 库, 它使 android 应用程序的开发变得更快、更容易。它使您的代码更加简单干净, 易于阅读。...那么要如何才能在Kotlin的环境中使用ButterKnife呢? 在早些时候,ButterKnife的作者已经帮我们想好解决方案了,那就是——KotterKnife,见名知意。...,我们的视图注入代码如下 val todoTitle: TextView by bindView(R.id.todo_item_todo_title) val todoContent: TextView...在 verticalLayout 代码段内部,创建了三个Android的控件 - 两个 editText 视图和一个 button 视图。这里视图的属性都在一行里面设置好了。...这些 ids 需要手工在一个加做 ids.xml 的文件里创建,这个文件放在 app/src/main/res/values/ids.xml。如果这个文件不存在就创建它。文件内容如下: <?
return "Movie(id='$id', title='$title', overview='$overview', posterPath='$posterPath')" } } API 返回的数据结构与解析...电影列表的整体布局的 UI 视图数据适配器 ViewAdapter 我们在创建 MovieListActivity 过程中需要展示响应的数据,这些数据由 ViewAdapter 来承载,对应的代码如下...SimpleItemRecyclerViewAdapter 类来装载 View 中要显示的数据,实现数据与视图的解耦。...val release_date: String, val posterPath: String) } 在 Android 4.0 之后默认的线程模式是不允许在主线程中访问网络...另外,Kotlin 的 Android 视图 DSL Anko 可以我们从繁杂的 XML 视图配置文件中解放出来。
作为开发人员,我们的目标只有一个:保证稳定的帧率来避免卡顿。...四、减少嵌套层次及控件个数 Android的布局文件的加载是LayoutInflater利用pull解析方式来解析,然后根据节点名通过反射的方式创建出View对象实例; 同时嵌套子View的位置受父View...,但是明显只使用TextView来做:嵌套层次、控件个数都更少。...Android定义了ViewStub类,ViewStub是轻量级且不可见的视图,它没有大小,没有绘制功能,也不参与measure和layout,资源消耗非常低。...八、总结 布局优化的通用套路 调试GPU过度绘制,将Overdraw降低到合理范围内; 减少嵌套层次及控件个数,保持view的树形结构尽量扁平(使用Hierarchy Viewer可以方便的查看),同时移除所有不需要渲染的
MotionEffect MotionEffect是2.1中的一个新的MotionHelper,可以让你根据视图的整体运动方向,自动为其引用的视图添加关键帧。它可以简化很多过渡动画的创作。...为了更好地理解它的作用,请看下面的例子。这个例子只使用了MotionLayout的start和end功能,它自动创建了两种场景下的过渡效果。 ?...MotionEffect中引用的视图才有可能得到效果。...其次,默认情况下,我们会自动计算这些视图的主要移动方向(在北、南、东、西之间),只有与该方向相反移动的视图才会得到应用于它们的效果。...https://xuyisheng.top/ 点击原文一键直达 专注 Android-Kotlin-Flutter 欢迎大家访问
Android 布局加载是 Android 应用程序的重要组成部分。布局加载是指将 XML 文件中定义的视图层次结构加载到内存中。...这些属性可以用来控制视图元素在布局中的位置和大小。 布局文件的解析过程 当应用程序启动时,Android 系统会将布局文件解析成一个视图层次结构,然后将其加载到内存中。...逐行解析 XML 文件,创建相应的视图对象,并设置视图对象的属性。 将所有视图对象组织成一个视图层次结构。 在解析布局文件时,Android 系统会使用反射机制来动态地创建视图对象。...merge 标签可以将多个视图容器合并成一个视图容器,从而减少视图层次结构的深度和内存占用率。.../> 使用 merge 标签可以将线性布局和文本视图合并为一个布局容器,从而减少视图层次结构的深度和内存占用率。
和控件操作都不是线程安全的,所以Android才会禁止在非UI线程更新UI,对于显式的非法操作,比如说直接在Activity里创建子线程,然后直接在子线程中操作UI等,Android会直接异常退出,并提示...its views便是一个例子,字面意思是只有创建视图层次结构的原始线程才能操作它的View,明显是线程安全相关的。...s.说明在错误的线程更新UI。 总结点: 不能在主线程(UI线程)进行耗时的操作,比如连接网络,拷贝大数据,睡眠等操作。 比如连接谷歌网络。...在4.0之后谷歌强制要求连接网络不能在主线程进行访问 只有主线程(UI线程)才可以更新UI 定时代码如下 MainActivity .java import android.os.Bundle; import...// 一旦计时器被终止,它的执行线程就会顺利地终止,并且不会再安排任务了。
它可以帮助开发者在用户界面上创建复杂的布局,并提供了精确控制视图之间关系和位置的能力。...这意味着你可以根据需要自由调整视图的位置,并确保在不同屏幕尺寸或设备方向下的正确布局。 性能优化:ConstraintLayout针对性能进行了优化,可以减少布局层次以及视图的嵌套。...TextView 1被设置为位于父容器的顶部,并与父容器的左右边缘对齐。同时,它的底部边缘与TextView 2的顶部边缘对齐。...TextView 2位于TextView 1的底部,并与父容器的左右边缘对齐。同时,它的底部边缘与Button的顶部边缘对齐。 Button位于TextView 2的底部,并与父容器的左右边缘对齐。...同时,它的底部边缘与父容器的底部边缘对齐。 通过这样的约束条件,我们可以实现一种垂直排列的布局,其中TextView 1位于顶部,TextView 2位于其下方,Button位于最底部。
随着用户的下拉或者上拉手势,已经被回收的列表项要重新加载到界面上,倘若每次加载都得从头创建视图对象,势必增加了系统的资源开销。...根据这种设计思路,提取出了循环视图基础适配器,它的Kotlin代码如下所示: //循环视图基础适配器 abstract class RecyclerBaseAdapter<VH : RecyclerView.ViewHolder...下面便是个循环视图的网格适配器,它实现了类似淘宝主页的网格频道栏目,具体的Kotlin代码如下所示: //把公共属性和公共方法剥离到基类RecyclerBaseAdapter, //此处仅需实现getItemCount...对于第一个的布局编码,可以考虑将其作为一个整型的输入参数;对于第二个的数据结构,可以考虑定义一个模板类,在外部调用时再指定具体的数据类;对于第三个的bind方法,若是Java编码早已束手无策,现用Kotlin...尤其是最后的两种实现方式,分别运用了Kotlin的多项综合技术,才能集Kotlin精妙语法之大成。 点此查看Kotlin入门教程的完整目录
所以如果您在布局中放入了一个 TextView ,视图绑定就会暴露一个 TextView 类型的属性给您。...在 ActivityAwesomeBinding.java 中,视图绑定生成了一个只有一个参数的 inflate 方法,该方法通过将 parent 设定为空值来指定当前视图不会绑定到父视图中;视图绑定也暴露了一个有三个参数的...bind 方法的简化版本 bind 是绑定对象中最复杂的一个方法,它通过调用 findViewById 来绑定每个视图。...在使用引入布局的时候,视图绑定会创建一个被引入布局绑定对象的引用。注意 <include 标签有一个 id: android:id=”@+id/includes”。...这里的逻辑跟使用普通视图一样, <include 标签也需要有一个 id 才能在绑定对象中生成对应的属性。 include 标签必须有一个 id,才能生成对应的属性。
所以如果您在布局中放入了一个 TextView ,视图绑定就会暴露一个 TextView 类型的属性给您。...在 ActivityAwesomeBinding.java 中,视图绑定生成了一个只有一个参数的 inflate 方法,该方法通过将 parent 设定为空值来指定当前视图不会绑定到父视图中;视图绑定也暴露了一个有三个参数的...bind 方法的简化版本 bind 是绑定对象中最复杂的一个方法,它通过调用 findViewById 来绑定每个视图。...在使用引入布局的时候,视图绑定会创建一个被引入布局绑定对象的引用。注意 include>标签有一个 id: android:id="@+id/includes"。...这里的逻辑跟使用普通视图一样, include 标签也需要有一个 id 才能在绑定对象中生成对应的属性。 include 标签必须有一个 id,才能生成对应的属性。
viewgroup.png Android为我们提供了View和ViewGroup的两个子类的集合,提供常用的一些输入控件(比如按钮,图片和文本域等)和各种各样的布局模式(比如线程布局,相对布局,绝对布局...用户界面布局 在你APP软件上的,用户界面上显示的每一个组件都是使用层次结构View和ViewGroup对象来构成的,比如,每个ViewGroup都是不可见容器,每个ViewGroup视图组用于组织子视图...View的容器,而它的子视图View可能是输入一些控件或者在某块区域的小部件UI。...如果你有了层次结构树,你可以根据自己的需要,设计出一些布局,但要尽量简单,因为越简单的层次结构最适合性能。 要声明布局,可以在代码中实例化对象并构建,最简单的方法也可以使用xml文件。 <?...,用来显示相对位置的子视图类,在默认情况下,所有子视图对会分布在左上角。
其实协程不仅在处理跨线程的问题有优势,还可以用来处理同一线程中的异步问题。 我认为有一个地方可以真正从中受益,那就是在 Android 视图系统中使用协程。...挂起函数 (Suspending functions) 是协程的基础组成部分,它允许我们以非阻塞的方式编写代码。...这种特性非常适用于我们处理 Android UI,因为我们不想阻塞主线程,阻塞主线程会带来性能上的问题,比如: jank。...等待 View 被布局完成 让我们看一个例子,它封装了一个等待 View 传递下一次布局事件的任务 (比如说,我们改变了一个 TextView 中的内容,需要等待布局事件完成后才能获取该控件的新尺寸):...对于刚接触代码的人来说, await 方法要比看似会断开的回调更具可读性。 最后 希望通过本文,您可以进一步思考协程还可以在哪些其他的 API 中发挥作用。
PhoneWindow是Window的子类。在这个PhoneWindow中,有一个DecorView的内部类,它是所有应用程序窗口的根视图,直接控制是否显示活动(参考旧驱动程序的原始单词…)。...然后,可以为这些对象定义一些其他行为,查询对象的状态,或修改布局。有关创建UI布局的完整指南,请参阅XML布局 用户界面组件 不需要使用所有View和ViewGroup对象创建UI布局。...android:text="I am a Button" /> APP用户界面上的每个组件都由View和ViewGroup对象的层次结构组成,如图1所示。...每个ViewGroup都是用于组织子视图的不可见容器。其子视图可以是在UI上绘制区域的输入控件或小部件。...ViewGroup:View类的子类,可以有子控件,可以视为容器。Android UI中的控件按照这种分层树结构堆叠。有两种方法可以创建UI布局。
BaseObservable和Observable的区别 BaseObservable是实现了Observable的类, 帮我们实现了监听器的线程安全问题....视图刷新数据 通过表达式使用@=表达式就可以视图刷新的时候自动更新数据, 但是要求数据实现以下两种方式修改才会触发刷新 <EditText android:layout_width="match_parent...<TextView android:layout_width="wrap_content" android:layout_height="wrap_content...高阶函数 创建自定义属性 object EventDataBindingComponent { /** * 在绑定视图时可以用于Model来处理UI, 由于破坏视图和逻辑解耦的规则不是很建议使用...创建DatabindingComponent的步骤: 创建自定义类, 类中存在包含使用@BindingAdapter的函数, 无需静态函数.
领取专属 10元无门槛券
手把手带您无忧上云