Android Weekly Notes Issue #318
Android Weekly Issue #318
July 15th, 2018
Android Weekly Issue #318
本期内容包括: Android Navigation Component结合NavigationView
和BottomNavigationView
; 建议build多个modules到一个大aar; 应用例子说明UI层构建; Realm代码迁移到Kotlin; MVI模式的用法; Facebook和Twitter的sdk集成实现;
Kotlin中的scope functions; Google的机器学习例子网站: Seedbank; 用Kotlin SDL包装一个Java Builder.
ARTICLES & TUTORIALS
Android Jetpack - NavigationUI
Jetpack中的Navigation Component可以帮助我们做Fragment间的导航转换, 从而减少一些样板代码.
本文介绍NavigationView
和 BottomNavigationView
结合navigation graph的用法.
Why We Need “fat” AARs for Android Libraries
作者希望能够用多个modules创建一个aar.
这样既有利于开发时候的业务分层, 也能够提供一个整体的第三方库.
这是作者提出的issue: https://issuetracker.google.com/issues/62121508
本文主要说明他需要这样做的理由.
Maintainable Architecture – UI Layer
一个天气应用的UI层设计.
(Kotlin, dagger).
Migrating your Realm to Kotlin
作者他们要把自己的Android应用迁移到Kotlin, 本文讨论了其中数据层迁移中(Realm相关)发现的一些问题.
Model-View-Intent & Data Binding
作者以一个登录界面为例, 讲述Model-View-Intent
模式的用法.
使用了这个MVI
的library: mosby.
文中例子用Kotlin实现, 结合MVI和Data Binding.
Social Network Integration on Android
Facebook和Twitter的SDK集成, 实现登录和分享功能.
Kotlin Demystified: What are 'scope functions' and why are they special?
Kotlin的"scope functions"是允许改变变量scope的函数.
Kotlin的标准库中有五个: apply
, run
, with
, let
和also
.
run
可以创建一个scope:
fun myFun() { val outside = 6.2831853071 run { val inside = 1.61803398875 // Both outside and inside are usable and in scope } // inside is out of scope, and only outside is available }
apply
, run
和with
都有一个有用的特性: 可以用this表示这个调用用到的变量:
class Foo { //... myView.run { // this refers to myView rather than Foo inside the block. alpha = 0.5f background = ContextCompat.getDrawable(context, R.drawable.my_drawable) } }
如果想用外面的变量, 可以像我们在内部类中做的那样: 用this@Foo
.
scope functions也是函数, 需要返回值.
一种是返回接受者, 比如apply
.
另一种是返回最后一个语句, 比如run
和with
.
let
工作起来像run
, 可以用来做一些不为null的时候的工作:
myIntent?.let { it.data = data startActivity(it) }
其中let
的引用对象不是用this
, 而是用it
.
也可以这样写:
myIntent?.let { intent -> intent.data = data startActivity(intent) }
also
工作起来像apply
, 也是用it
.
可以做一些额外的工作, 比如:
val myListener = Listener().also { addListener(it) }
和:
val key: String get() = keystore.getKey(KEY_ID).also { Log.v(TAG, "Read key at ${System.currentTimeMillis()}") }
还有一些操作符: forEach
, map
, filter
, 它们实际上也创建了scope, 但是它们也有一些其他的工作, 比如迭代, 映射, 过滤等. Scope functions特殊的地方就在于, 只创建scope, 没有任何其他工作.
关于如何选择, 这里有一个流程图.
如果你想返回对象本身, 那么用apply
或also
, 如果想返回一个其他结果, 用let
, run
和with
.
Seedbank — discover machine learning examples
Google启动的Seedback是一个机器学习的例子网站, 每一个例子都可以用浏览器查看, 并且可以编辑扩展.
From Java Builders to Kotlin DSLs
DSLs – Domain Specific Languages.
本文讲一个具体的DSL实现: 把一个Java的Builder用Kotlin包装.
作者把这个库MaterialDrawer用Kotlin包装了: MaterialDrawerKt.
LIBRARIES & CODE
android-face-detector
Android实时人脸检测的库, 基于Firebase的ML kit.
UnderlinePageIndicator
配合ViewPager使用的一个indicator, 给tab文字加上下划线, 有滑动动画.
Seedbank
机器学习例子库.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2013-07-20 Servlet基础(三) Servlet的多线程同步问题
2013-07-20 Servlet基础(二) Servlet的生命周期
2013-07-20 Servlet基础(一) Servlet简介 关键API介绍及结合源码讲解