欢迎阅读《安卓开发的小技巧》系列的第二篇!就像我们上星期在第一篇小技巧文章里说的那样,这是一个不定期更新的博文系列,安卓开发团队会在这里和大家分享开发的建议和小技巧。
我们鼓励团队中的每个人每周都尽可能多地分享小技巧,尽管有些小技巧对他们来说可能是显而易见的。毕竟,你根本不知道什么时候,你分享的一条信息会让人们学到新的知识。我们真心希望这周的小技巧会对你有所帮助。
技巧 1 如果安卓在应用程序运行时,决定更新系统的网络视图组件,这样会使你的应用程序崩溃:http://stackoverflow.com/questions/29575313/namenotfoundexception-webview技巧 2
在 MaterialDesign 中,一些视图必须遵循标准的填充和边距。
除非你训练有素能看出填充的错误,并且已经发现这段小技巧中每个单词间都有两个空格,那你还是赶紧来试试这个 app 吧,它能确保每个元素能在 app 中恰好排成一排: https://play.google.com/store/apps/details?id=com.faizmalkani.keylines
(译者注:该段英文原文的每个单词间有两个空格。)
技巧 3
1 |
getChildLayoutPosition |
会返回一个(列表项)的位置,就算你从适配器列表中移除一项(列表项也能返回),因为这个view(视图)可能正在滑出可视区域,但是它还在RecyclerView中。
技巧 4
针对 API 23 以前版本的应用程序,GET_ACCOUNTS 是一个运行时的权限,不能在权限页面上禁止它(事实上,如果这是在联系人群组中唯一的权限,那么你甚至都看不到联系人群组的选项)。这打破了许多 app 对存在一个用户的假设。
技巧 5
Chrome 改变了它处理 deep links 的方式。你不可能仅仅只是在地址栏中键入一个 URL,就能意外触发一个 deep link。
举个例子,你过去常常是在 Chrome 地址栏键入“pandora.com“,就会打开Pandora 应用程序,而不是把用户导航到 Pandora 的网页。新的改进是,用户的的确确会被带到 Pandora 的网站。
当然,为了能够从你的网站 deep link 到一个应用程序,你需要用下面的新格式来规范链接的格式:
intent:
1 2 3 4 5 6 7 8 9 |
intent: HOST/URI-path // Optional host #Intent; package=[string]; action=[string]; category=[string]; component=[string]; scheme=[string]; end; |
例如:
1 |
<a href="intent://scan/#Intent;scheme=zxing;package=com.google.zxing.client.android;end"> Take a QR code </a> |
专业建议:你也可以在链接中包含一个回退的URL,或者是一个包名。这样可以在用户没有安装 app 时,提供回退的功能。
Chrome 首先会检查回退的 URL,并将用户导航到那里。如果没有提供回退的 URL,Chrome 会查找包名,之后会把用户带到Play Store(安卓市场)去下载安装包。
如果用户没有安装 app 并且(链接)中也没有提供回退地址,用户会看到一个 404 Not Found 的页面。在这里可以了解更多信息:https://developer.chrome.com/multidevice/android/intents
技巧 6
使用支持 23.0.0 版本 的 Loaders 时要注意,因为 Fragment 与 Activities 协同工作方式的改变,一个 bug 也随之产生,这个 bug 会导致 Loaders 在横竖屏切换时丢失。
这个错误虽然在 23.1.0版本中已经被修正了,但是依然出现了在child fragments中 Loader 在横竖屏切换时丢失的问题。目前修正这个问题的方案就是使用低于 23.0.0 的版本。
技巧 7
在 OSX 中,你可以拖动光标到显示屏底部并且持续下拉,这样可以在不同的显示屏中唤起 Dock 栏。
严格来说,这个问题与安卓无关,但是如果你的 Mac 上有多个显示屏,那么这个问题可能时常会让你抓狂。
如果你的 Dock 不是设置在底部而是其他地方,那么你可以查看一下其他情况的评论。
技巧 8
在可能的情况下,使用
1 |
Collections.emptyList() |
和
1 |
Collections.emptySet() |
而不是通过方法返回一个新的空集合。这个 collections 类负责维护一个不可变的空 list/set 实例,没有必要新建另一个(空集合)。