Kotlin for Android:自定义视图和 Android 的扩展

发布于 2024-11-29 04:54:25 字数 3668 浏览 11 评论 0

在了解 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

风苍溪

暂无简介

文章
评论
760 人气
更多

推荐作者

梦途

文章 0 评论 0

唐睦州

文章 0 评论 0

且行且努力

文章 0 评论 0

Yiu Peng

文章 0 评论 0

albertliao

文章 0 评论 0

逆夏时光

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文