title | date | author | tags | keywords | categories | reward | reward_title | reward_wechat | reward_alipay | source_url | translator | translator_url |
---|---|---|---|---|---|---|---|---|---|---|---|---|
[译]Announcing Anko for Android |
2015-04-08 09:20:00 -0700 |
Hadi Hariri |
官方动态 |
false |
Have a nice Kotlin! |
我们很高兴地宣布,我们一直致力于 Android 开发的图书馆,其中除了别的以外,还可以使用 DSL 以类型安全和动态的方式创建应用程序界面。
这是一个简单的例子,描述安科的一些可能性。想象一下,我们需要创建一个简单的注册表单,包括用户名和<注册> 按钮
的EditText
。使用安科的代码是:
{% raw %}
{% endraw %}import kotlinx.android.anko.*
class MainActivity : Activity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
verticalLayout {
padding = dip(16)
textView("Username:") {
textSize = 18f
}.layoutParams { verticalMargin = dip(4) }
val login = editText()
button("Sign up") {
textSize = 20f
onClick { login(login.text) }
}.layoutParams { topMargin = dip(8) }
}
}
}
{% raw %}
{% endraw %}{% raw %}
{% endraw %}
安科广泛使用 Kotlin 扩展功能和属性 安排进去 类型安全的建设者 来描述用户界面。作为回报,我们在编译时得到简洁和类型安全。 当然,我们还可以在设计时使用 Anko Preview 插件来查看预览,这些插件适用于 IntelliJ IDEA 和 Android Studio:
{% raw %}
{% endraw %}如果我们现在想添加另一个文本输入小部件,例如电子邮件,我们可能会创建另一对textView()
和editText()
函数调用。然而,更好的方法是将相应的 DSL 片段提取为新的功能:
{% raw %}
{% endraw %}override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
verticalLayout {
padding = dip(16)
val login = inputField("Username")
val email = inputField("E-mail")
button("Sign up") {
textSize = 20f
onClick { login(login.text) }
}.layoutParams { topMargin = dip(8) }
}
}
fun _LinearLayout.inputField(name: String): TextView {
textView("$name:") {
textSize = 18f
}.layoutParams { verticalMargin = dip(4) }
return editText()
}
{% raw %}
{% endraw %}任何额外的输入只需要单个函数调用。 表格的最终结果是:
{% raw %}
{% endraw %}当您使用 Android 侦听器的方法很多时,安科非常有用。考虑下面写的不使用安科的代码:
{% raw %}
{% endraw %}seekBar.setOnSeekBarChangeListener(object: OnSeekBarChangeListener {
override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) {
// Something
}
override fun onStartTrackingTouch(seekBar: SeekBar?) {
// Just an empty method
}
override fun onStopTrackingTouch(seekBar: SeekBar) {
// Another empty method
}
})
{% raw %}
{% endraw %}这是使用安科的版本:
{% raw %}
{% endraw %}seekBar {
onProgressChanged { (seekBar, progress, fromUser) ->
// Something
}
}
{% raw %}
{% endraw %}具有空体的方法不再需要空的实现。另外,如果为相同的 View 设置onProgressChanged()
和 onStartTrackingTouch()`,这两个“部分定义”的监听器将被合并。
安科不仅仅是一个 DSL,而是一个促进 Android 开发在不同领域的图书馆。它有许多方法涵盖对话框,异步任务,服务,意图甚至 SQLite 数据库访问。
例如,如果要启动新的活动
:
{% raw %}
{% endraw %}// Without Anko
val intent = Intent(this, javaClass<MyActivity>())
intent.putExtra("id", 5)
startActivity(intent)
// With Anko
startActivity<MyActivity>("id" to 5)
{% raw %}
{% endraw %}或激活振动器:
{% raw %}
{% endraw %}// Without Anko
val vibrator = getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
vibrator.vibrate(500)
// With Anko
vibrator.vibrate(500)
{% raw %}
{% endraw %}或者甚至发送吐司信息:
{% raw %}
{% endraw %}// Without Anko
Toast.makeText(this, "Download is complete!", Toast.LENGTH_SHORT).show()
// With Anko
toast("Download is complete!")
{% raw %}
{% endraw %}你可以用 Java 编写你的旧类。此外,如果您仍然希望(或有)编写 Kotlin 活动类并由于某种原因夸大 XML 布局,则可以使用View
属性和监听器助手,这将使事情变得更容易:
{% raw %}
{% endraw %}name.hint = "Enter your name"
name.onClick { /* do something */ }
{% raw %}
{% endraw %}希望你能看到安科提供了一系列的好处,特别是:
- 一切都在一个地方。而不是将布局分解成静态(XML)和动态部分,然后尝试将它们绑定在一起,我们可以使用 Kotlin 编写我们想要的所有内容。编译时类型检查是一个甜蜜的奖励。
- 安科可以使我们的代码更简洁易读。
- 它允许轻松重复使用。我们可以将 DSL 的一部分提取成功能并多次使用。
安科还处于阿尔法阶段,但是我们希望尽快发布您的反馈意见,所以请试试。我们尽可能简单地做到这一点。它全部发布在 Maven Central 上,如果您使用 Gradle,您可以轻松地将所需的依赖项添加到build.gradle
文件中:
{% raw %}
{% endraw %}dependencies {
compile 'org.jetbrains.anko:anko:0.5-15'
}
{% raw %}
{% endraw %}Anko Preview 插件可用于 IntelliJ IDEA 和 Android Studio。您可以 下载 它直接从插件存储库。 有二进制文件针对的是原始 Android(SDK 版本 15,Ice Cream Sandwich)和 Android,支持 v4 软件包。 此外,最后但并非最不重要的是,与 Kotlin 相关的所有内容,Anko 都是完全开源的。存储库已打开 GitHub 和往常一样,欢迎贡献!