• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > Android的Kotlin秘方(I):OnGlobalLayoutListener,

Android的Kotlin秘方(I):OnGlobalLayoutListener,

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了kotlin android,androidstudio kotlin,kotlin开发android,kotlin android教程,kotlin for android等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

Android的Kotlin秘方(I):OnGlobalLayoutListener,


春节后,又重新“开张”。各位高手请继续支持。谢谢!

 

 

原文标题:Kotlin recipes for Android (I): OnGlobalLayoutListener

原文链接:http://antonioleiva.com/kotlin-ongloballayoutlistener/

原文作者:Antonio Leiva(http://antonioleiva.com/about/)

原文发布:2016-03-16 ­

 

Android的Kotlin秘方(I):OnGlobalLayoutListener

 

今天一位同伴问我怎样恰当使用OnGlobalLayoutListener,而不需要太多的模板。这是一个棘手的问题,我们需要进一步深入研究。

 

OnGlobalLayoutListener是干什么的?

这个侦听器对于任何试图的ViewTreeObserver都适用,并且在已知视图宽度和高度进行各种计算、动画等等时,为扩展和测量视图常常回调它。

 

幸亏Kotlin提供很好的与Java互操作性,我们能够以一种非常清晰的方法 —— 使用它的模拟属性和Lambda表达式 —— 实现单一方法接口:

1 recycler.viewTreeObserver.addOnGlobalLayoutListener {
2     // do whatever
3 }

这里有什么问题吗?为了预防泄漏,推荐的实践是在完成使用它后,立即删除这个侦听器。但是由于使用了Lambda表达式,Lambda没有对象那么精确,我们没有对象的引用。

 

原方式还是可以用,但是在Kotlin中直接用匿名对象,每次都会有一只小猫死去。如果仍然需要做下面这样的事,没法改用更好开发语言:

1 recycler.viewTreeObserver.addOnGlobalLayoutListener(
2         object : ViewTreeObserver.OnGlobalLayoutListener {
3             override fun onGlobalLayout() {
4                 recycler.viewTreeObserver.removeOnGlobalLayoutListener(this);
5                 // do whatever
6             }
7         });

 

找一个更佳替换方法

好了,既已知不要那样做。那么有什么更好的方法吗?我们被迫使用一种看上去没有那么好看的方法,但是可能是一种好的选择,将扩展函数隐藏起来。

 

为视图接收另一个函数创建一个新函数,由它自己创建和删除侦听器。就像这样:

1 inline fun View.waitForLayout(crossinline f: () -> Unit) = with(viewTreeObserver) {
2     addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {
3         override fun onGlobalLayout() {
4             removeOnGlobalLayoutListener(this)
5             f()
6         }
7     })
8 }

 

现在你就可以调用这个函数,确保其自己添加和删除侦听器。除非,你永远不会忘记删除:

1 recycler.waitForLayout { 
2     // do whatever
3 }

 

如果喜欢,可以用扩展ViewTreeObserver的函数,而不是直接用View。这取决你。

 

但是我们仍可以改进它

这是在测试视图后布局侦听器通常要做的一些事,所以需要等待宽度和高度大于0。而且可能要在视图中调用它时做一些事,这为什么不能转换参数函数到扩展函数?

 

我还泛型该函数使它能够在任何继承View的对象中使用,也能够从编写的函数中访问所有它的指定函数和属性。

 1 inline fun <T: View> T.afterMeasured(crossinline f: T.() -> Unit) {
 2     viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {
 3             override fun onGlobalLayout() {
 4                 if (measuredWidth > 0 && measuredHeight > 0) {
 5                    viewTreeObserver.removeOnGlobalLayoutListener(this)
 6                    f()
 7                 }
 8             }
 9        })
10 }

 

这个afterMeasured函数非常类似前者,但是在Lambda表达式内直接用视图的属性和public方法。例如,我们能够得到recycler的宽度和基于它用列的动态数组设置布局。

1 recycler.afterMeasured {
2     val columnCount = width / columnWidth
3     layoutManager = GridLayoutManager(context, columnCount)
4 }

总结

在Android中运行时,这确实仍有些事情做的不是很好,即使是移植Kotlin,但是总是可以通过隐藏在其他结构背后的不确定因素,找到提升可读性和避免不确定因素的选择。至少,仅需要编写一次,而其它代码则非常漂亮!

 

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 想要了解Kotlin,看这个就够了,想要Kotlin,
  • 浅谈Kotlin(三):类,浅谈kotlin
  • 浅谈Kotlin(二):基本类型、基本语法、代码风格,浅谈kotlin
  • 浅谈Kotlin(一):简介及Android Studio中配置,kotlinandroid
  • 在Kotlin上怎样用Mockito2 mock final 类(KAD 23),kotlinmockito2
  • 在Android上Kotlin的单元测试(KAD22),kotlinkad22
  • 在Android上,怎样与Kotlin一起使用Retrofit(KAD21),kotlinretrofit
  • Kotlin怎样使用Android的Dagger2,kotlindagger2
  • Kotlin中when表达式的使用:超强的switch(KAD 13),kotlinkad
  • Kotlin中功能操作与集合(KAD 11),

相关文章

  • 2017-05-26安卓开源项目周报0405,安卓开源项目0405
  • 2017-05-26Android用Intent来启动Service报“java.lang.IllegalArgumentException: Service Intent must be explicit”错误的解决方法,explicitintent
  • 2017-10-15Android源码基础解析之Activity布局绘制流程
  • 2017-05-26回收ImageView占用的图像内存,imageview占用图像
  • 2017-07-23Activity、View、Window三者之间的关系
  • 2017-11-18android开发使用组件心得
  • 2017-05-26记一次流量异常处理
  • 2017-05-26浅谈Kotlin(三):类,浅谈kotlin
  • 2017-05-26android shareSDK实现第三方分享,androidsharesdk
  • 2017-05-26linux和android调试工具介绍及方法汇总

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • Android捕获崩溃异常,Android捕获崩溃
    • Android TabHost使用,androidtabhost使用
    • Eclipse迁移到Android studio步骤如下:,eclipseandroid
    • 4.1.1 Activity初学乍练
    • Android中View自定义XML属性详解以及R.attr与R.styleable的区别
    • 填坑实录 Android Studio 利用 ADB WIFI 插件实现真机无线调试,androidadb
    • Android之ViewPager 第二课,androidviewpager
    • android StringBuffer 和StringBuilder,androidstringbuffer
    • 使用flume+kafka+storm构建实时日志分析系统
    • Android,androidstudio

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有