Tag Android

你好, View Binding! 再次再见, findViewById!

作为一个 Android 开发者, 你一定听说过 findViewById. 这个方法可以根据 ID 去匹配对应的 View. 实现了类似功能或者增强了其功能的还有: Butter Knife(Kotter Knife) Kotlin Android Extensions Data Binding View Binding 为什么不是 findViewById/Butter Knife(Kotter Knife)/Kotlin Android Extensions ? 优雅程度 可以确定的是 findViewById 和 Kotter Knife 是最不优雅的. 每初始化一个 view 都需要调用一次 findViewById 或 bindView…

GraphQL on Android

 什么是 GraphQL GraphQL is a query language for APIs and a runtime for fulfilling those queries with your existing data. 如果你是一个移动开发者, 相信你对 RESTful API 一定不陌生. GraphQL 由 Facebook 在 2012 年开发并开源, 是一门 查询语言, 可作为 RESTful API 的替代方案. GraphQL 并不针对某个特定平台, Android,…

探索 Android 中的 Span

在 Android 中,使用 Span 定义文本的样式. 通过 Span 改变几个文字的颜色,让它们可点击,放缩文字的大小甚至是绘制自定义的项目符号点(bullet points,国外人名中名字之间的间隔符号 · ,HTML 中无序列表项的默认符号)。Span 能够改变 TextPaint 属性,在 Canvas 上绘制,甚至是改变文本的布局和影响像行高这样的元素。Span 是可以附加到文本或者从本文分离的标记对象(markup objects);它们可以被应用到部分或整段的文本中。 让我们来看看Span如何使用、提供了哪些开箱即用的功能、怎样简单地创建我们自己的 Span 以及如何使用和测试它们。 Styling text in Android Appearance vs metric affecting spans Character vs paragraph affecting spans Creating custom spans Testing…

将 Android 项目迁移至 Kotlin Coroutines

前言 在2017年 Google I/O 大会上, Google 宣布了 Android 平台对 Kotlin 语言的官方支持. 我思考了很久如何向没有听说过 Kotlin 语言的开发者介绍它呢? 用这个知乎的段子应该是最合适不过了: Scala:想解决 Java 表达能力不足的问题 Groovy:想解决 Java 语法过于冗长的问题 Clojure:想解决 Java 没有函数式编程的问题 Kotlin:想解决 Java 段子归段子, 事实上, Kotlin 在国外公司的应用已经十分广泛, 如 Pinterest, Gradle, Evernote, Uber, Trello, Square, Google 等等. 那么为什么要使用…

Android Tools attributes listItem 和 sample data 的用法

tools attributes 你听说过 layout tools attributes 吗? 有时候我们会引入下面的代码, 但是你了解过它具体的作用吗? 拿最简单的 TextView 举个例子, 我们知道为 TextView 设置 text 的方法是: 我们想要在 XML 中预览数据可以直接通过上面的方法实现, 但是直接在 XML 中写死就有可能出现这样的情况: 从网络或者数据库获取数据有一定的延迟, 用户可能先看到了我们预设的假数据, 然后 TextView 才更新为从数据库或者网络获取到的数据, 这就很尴尬了. 使用 Tools Attributes 就可以避免上面这种尴尬情况的出现. 我们将 替换为 我们就可以直接在 Android Studio 中预览效果, 但是在打包…

探索 Android Design Support Library v28 新增内容

Android Support Library v28 版本最近被宣布推出 — 在当前的 alpha 版本中, 我们又有了一系列令人兴奋的新组件. 在这篇文章中, 我想要看看以 Material 视图组件形式添加进入 Support Library 的新增部分. Material Button Material Button 是一个小部件, 可用于在你的应用程序的用户界面中显示材质样式的按钮. 这个类从你可能已经使用的 AppCompatButton 类继承而来. 它们之间有什么不同呢? 这个按钮开箱即用, 它被设计成具有物质本质外观和质感, 而无需使用样式标志定义. 我们按照原样使用 MaterialButton 类, 并且在我们的视图中, 它将具有我们所追求的材质外观和质感 — 将其视为一个提供方便的类. 我们可以像这样将这个按钮添加进布局文件中: 默认情况下, 此类将使用主题的…

DeepLinkDispatch 的用法

什么是DeepLink深度链接? 先看图: 一个在Telegram中的dribbble链接, 点击后直接跳转到我的 Mango中, 是不是很神奇? 为什么要使用DeepLink? 一句话总结便是提升用户体验: 原生App在功能和体验上肯定是要强于网页的. DeepLinkDispatch DeepLinkDispatch提供了一种声明式的, 基于注解的API, 用于定义应用深度链接. 我们可以注册一个Activity, 并用@DeepLink和一个URI注解,然后她就可以处理特定的深度链接了.没错,就是这么简单. DeepLinkDispatch会对URI进行转换,并将深度链接和URI中特定的参数一起分发给合适的Activity. 举个🌰 下面,我们注册一个ShotActivity,并从像https://dribbble.com/shots/12345的链接中获取一个ID. 我们使用@DeepLink注解并且标注出将会有一个参数被标识为id. 多个深度链接 有时候我们可能需要在一个Activity中处理多种链接: 方法注解 我们还可以将@DeepLink注解用于任何public static方法(在Kotlin中即companion object中的方法). DeepLinkDispatch会调用这个方法来创建Intent 如果我们需要Intent的extras, 可以直接在方法中添加一个Bundle类型的参数,例如: 如果我们需要定制Activity的返回栈, 可以返回一个TaskStackBuilder而不是一个Intent. DeepLinkDispatch会调用被注解的方法,从TaskStackBuilder的最后一个Intent创建Intent, 当从已经注册的deep link启动Activity时使用. 查询参数 查询参数被自动的转换和传递,并且像其他参数一样是可获取的. 例如, 我们可以获取URI foo://example.com/deepLink?qp=123 传递过来的查询参数: 回调…

简单高效的实现 Android App 全局字体替换

Android O 推出了一项新的功能「Fonts in XML」,借助这项功能,我们能够像使用其他资源文件一样使用字体,比较方便地实现App全局字体的替换。 为了能够在API 14或者以上的设备上使用Fonts in XML特性,我们需要使用到Support Library 26。更多的内容可以参考「使用Support Library」小节。 在Android Studio中按照如下步骤将字体作为资源文件添加至工程: 右键单击项目的 app / res 文件夹,然后选择 New > Android resource directory。 打开下拉菜单并选择 font,输入 font 作为File name,点击OK。 注意名称字体资源文件夹的名称必须为font 将字体文件拖放到新的 res / font 文件夹中。Android O支持 .otf(OpenType) 和 .ttf(TrueType) 两种格式的字体文件。…

Android APK 瘦身实践

在开始对APK进行正式的减肥之前,我们先来了解一下APK包的构成,这样才好对症下药嘛。知己知彼方能百战不殆。 APK文件内容速揽 我们可以通过 unzip <apkname>.apk 命令实现对apk的解压(你也可以直接将<apkname>.apk更名为<apkname>.zip后直接通过解压软件解压)。解压后,我们就会得到一个文件夹了,里面包含了: 各个文件和目录的作用是什么呢? 文件/目录 作用 AndroidManifest.xml 清单文件,列出了应用的名称,版本,权限等信息。 assets 配置文件,放置一些本地资源,例如本地html,可以通过使用AssetManager检索。 classes.dex, classes2.dex 编译后的字节码文件,能够被Dalvik/ART理解。 lib 存放特定平台使用的编译后的.so文件,每一个子文件夹对应一个特定的平台,例如armeabi, armeabi-v7a, arm64-v8a, x86, x86_64, and mips. META-NIF 包含 CERT.RSA, CERT.SF, MANIFEST.MF, 存放的签名信息,用于保证系统的安全性和APK文件的完整性。 res 存放没有被编译到 resources.arsc文件中的资源文件。 resouces.arsc 编译后的二进制资源文件。存放 res/values/ 目录下的所有XML内容。打包工具对XML内容进行提取,编译为二进制,并进行分类,其中,XML内容包含了不同语言的strings和styles,同时还包含没有被直接打包至 resources.arsc 文件的其他文件的路径,例如布局文件和图片文件。 OK,既然我们已经了解了APK的各个组成部分,那么我们就可以针对下面的三个组成部分,采取逐个击破的方式,达到缩减APK体积的目的:…

Android 实现条形码与二维码扫描

Android实现条形码与二维码扫描 在本次教程中,我们将使用ZXing库让我们的app实现条形码和二维码的扫描。 为什么选择ZXing 要实现条形码和二维码扫描功能,常用的有下面几种方法: 使用Google Play Service和Mobile Vision APIs。 使用barcodescanner库。 使用ZXing库。 我们来仔细分析以上三种方法各自的优缺点。 第一种,使用Google Play Service和Mobile Vision APIs。不合适,因为不是所有的用户设备都有安装Google Play Service,特别是在中国。 第二种,使用barcodescanner。也不合适,尽管barcodescanner的导入非常简单,识别也很快,但是UI的调整比较困难。特别是当UI非常复杂时,你就需要拉取整个项目的源码然后自己进行定制。 现在就只剩下ZXing了。ZXing库由谷歌出品,所以在短期内应该不会停止维护。很多应用,报错barcodescanner,都是基于ZXingk开发的。使用ZXing我们不用担心用户没有安装Google Play Service,而聚焦于开发和处理结果本身。 ZXing是什么 Zxing是Google提供的关于条码(一维码、二维码)的解析工具,提供了二维码的生成与解析的方法。 设置项目 添加依赖 在你的build.gradle文件(application级别)中,添加ZXing core的库。 添加必要的权限 在你的AndroidManifest.xml文件中,添加下面的代码: 导入必要的类和资源文件 将整个包复制到你的项目中。 注意:上面的包中的代码我做了简化,如果你需要ZXing示例项目此部分的完整的代码,请访问这里,并下载相应的代码。 代码文件导入完成后,我们还需要导入下面的资源文件: res/layout/activity_scan – CaptureActivity的布局文件. res/values/zxing_ids.xml –…

使用 ViewPager 实现 Material Design 风格炫酷引导页

当我们第一次打开一个App,首先映入眼帘的就是引导页了。 引导页向我们展示了一些可以滑动的页面,并在页面中以图片方式展示了这个App的一些亮点。要实现这个效果,网上更多的是通过引入第三方库的形式,但是,这哪里有我们自己动手撸一个来的痛快呢?所以,今天我将手 摸 把手的带大家实现一个符合Material Design标准的炫酷引导页。 效果预览 我们首先来看看Google Docs是实现的效果: 下面是我们将要实现的效果: 设计规范 在Material Design官方文档中,关于引导页的部分是这样说明的: Onboarding is a virtual unboxing experience that helps users get started with an app’s UI. It should be brief and enhance the use of the app. 简单来说,引导应该是一个简短的过程,能够帮助用户理解App的使用。 那么,我们应该什么时候使用引导呢?按照规范,当我们的应用添加了新的特色功能或者有重大改变时,应该使用引导页面。对于那些用户本来就期待的,很普通的功能,就不要滥用引导页了。…

Realm 在 Android 上的应用

什么是Realm? 在Android平台上,有很多基于SQLite的ORM框架,例如GreenDAO, OrmLite, SugarORM, LitePal等等,对于写习惯了SQL语句的小伙伴们来说,看到SQLite这样的数据库肯定是倍感亲切了,有了这些框架更是如虎添翼。 但是,在我们日常的开发中,数据量并不会特别的大,表的结构也不会特别复杂,用SQL语句有种大(过)材(于)小(繁)用(琐)的感觉,我们需要做的事情可能仅仅是把用户生成的数据对象快速的缓存起来。 这个时候NoSQL就派上了用场,以Mongodb,Redis为代表的NoSQL都引入了一些相对现代化的方式存储数据,比如支持Json,Document的概念,流式api,数据变更通知等等,极大程度的降低了我们学习的成本提高了我们的开发效率。而Realm作为一款移动端的NoSQL框架,官方定位就是替代SQLite等关系型数据库。 Realm是一个由Y Combinator孵化的创业团队开源出来的MVCC(多版本并发控制)的数据库,支持运行在手机,平板和可穿戴设备等嵌入式设备上。 Realm的优点 简单易用 速度快 跨平台 高级功能 可视化 开源 简单易用 上面我们已经说过,Realm并不是基于SQLite上的ORM,它有自己的数据库引擎,使用也非常简单。我们先来看看一段简单的代码。 速度快 我们直接看Realm官方的对比测试数据吧。 每秒能在200K数据记录中进行查询后count的次数: Realm能够达到30.9次,而SQLite只能达到13.6次,Core Data只能达到可怜的一次。 在200K条数据记录进行一次遍历查询,数据和前面的count相似: Realm能够达到每秒遍历200K数据记录31次,SQLite只能达到14次,而Core Data只有可怜的2次。 在一次事物中每秒插入数据量的对比,SQLite可以达到178K条记录,性能最好,Realm可以达到94K,而Core Data再次垫底,只有18K。 我自己也进行一次简单的测试,以JSON格式插入641条记录(好吧,我知道数据量比较小,仅仅只是一个参考,具体的数据可以参考这里)。 207毫秒(Android 7.1.1, Realm 3.0)。 跨平台 Realm目前支持Objective-C(iOS), Swift(iOS), Java(Android), JavaScript, Xamarin等平台。 现在很多应用都需要兼顾iOS和Android两个平台,使用Realm可以使用Realm提供的API,在数据持久化层实现两个平台的无差异化移植,无需对内部数据的架构进行改动。…