Kotlin for Android:自定义视图和 Android 的扩展
在了解 extension functions and default values 可以为我们做什么后,你可能想知道接下来将会发生什么。 在 first article about Kotlin 我们讨论过,Kotlin 使得我们的开发变的更加简单,并且接下来我将更加深入的阐述这一观点。
自定义 View
Kotlin 的以往版本(一直到 M10)是不支持去创建自定义 view 的。原因是我们在使用 Kotlin 时,每一个类只有一个构造函数。这通常是足够的,因为我们使用可选参数来使构造函数足以满足我们的需求。下面就是这样的一个例子:
class MyClass(param: Int, optParam1: String = "", optParam2: Int = 1)
{
init {
// Initialization code
}
}
有一个独特的构造函数,我们现在有四种方法来创建这个类:
val myClass1 = MyClass(1)
val myClass2 = MyClass(1, "hello")
val myClass3 = MyClass(param = 1, optParam2 = 4)
val myClass4 = MyClass(1, "hello", 4)
正如你所见,我们通过可选参数达到了我们想要的多构造函数的目的。但是这导致了一个问题就是如果我们尝试通过继承系统的 View 来创建一个 Android 自定义 View。自定义 View 需要重写不止一个父类的构造函数才能够正常运行,并且 Kotlin 没有提供这样的方法。幸运的是,从 Kotlin M11 版本发布后就支持声明多个构造函数,就像我们在 Java 下一样。这是一个 ImageView 保存平方率的例子:
class SquareImageView : ImageView {
public constructor(context: Context) : super(context) {
}
public constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {
}
public constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {
}
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
val width = getMeasuredWidth()
setMeasuredDimension(width, width)
}
}
非常简单,它可能不太详细,但是至少我们现在有一个方法。
Kotlin Android 扩展组件
通过 Kotlin M11,我们还提供了一个新的插件,这个插件将会帮助我们这个 android 开发者们用一种更加简单的方法去访问 xml 下定义的 view,当你们使用这个方法时你们将会记得 Butterknife,但是这个将会更加简单的去使用它。
Kotlin Android 扩展组件是一个基本的控件绑定,它将会让你在代码中通过 id 来使用你在 xml 中定义的 view,它将会在不使用任何注解或者 findViewById 的方法自动创建这些属性。
使用这个扩展组件,你需要安装一个新的插件,这个插件叫做 Kotlin Android Extensions 并且添加通过 buildscript 来添加这个地址(在项目的 build.gradle=中)
buildscript {
…
dependencies {
…
classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version"
}
}
设想你有一个一个布局,叫 main.xml:
<FrameLayout
xmlns:android="..."
android:id="@+id/frameLayout"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/welcomeText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</FrameLayout>
如果你想在你的 activity 中使用这个 view,你唯一需要做得就是导入这个 Kotlin Android Extensions 提供的属性:
import kotlinx.android.synthetic.<xml_name>.*
在我们的例子中,它将是主要的:
import kotlinx.android.synthetic.main.*
现在你可以通过 id 使用你的 view 了:
override fun onCreate(savedInstanceState: Bundle?) {
super<BaseActivity>.onCreate(savedInstanceState)
setContentView(R.id.main)
frameLayout.setVisibility(View.VISIBLE)
welcomeText.setText("I´m a welcome text!!")
}
总结
通过这两个新功能,我们 Kotlin 团队真正感兴趣的是让 android 开发者们可以生活的更加轻松。他们也发布了一个叫做 Anko 的库,让我们通过 Kotlin 创建布局。我们有使用其主要功能,但是你在处理 View 时可以使用它去简化你的代码,我有一些 Kotlin 项目的例子已经提交到 github,你可以看看这些例子或者其他相关资料。
下一个文章将会介绍使用 lambda 表达式和他们怎样才能帮助我们简化代码。非常有趣,对我来说,Kotlin 和 java 1.7 比较起来将会变的非常有力。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论