使用Anko简化Android应用开发

由Kotlin背后的组织JetBrains设计的Anko是一个开源库,可以从根本上改变您创建Android应用程序的方式。 它利用Kotlin的语法提供了大量的辅助函数,可以帮助您减少代码的冗长性,同时还可以提高其性能。

Anko可以兼作DSL,是领域特定语言的缩写,用于创建Android布局。 换句话说,它可以作为布局XML文件的一种类型安全,动态且可重用的替代方法,您可能已经知道,布局XML文件对于大型应用程序往往很笨拙。

在本教程中,我将通过向您展示如何使用其一些最受欢迎的功能来帮助您开始使用Anko。

1.项目设置

为了能够在Android Studio项目中使用Anko的核心功能,您需要做的就是在app模块的build.gradle文件中添加以下implementation依赖

implementation 'org.jetbrains.anko:anko:0.10.1'

但是,如果您希望Anko使用Android支持库中的小部件,则需要以下附加依赖项:

implementation 'org.jetbrains.anko:anko-appcompat-v7:0.10.1'
implementation 'org.jetbrains.anko:anko-design:0.10.1'
implementation 'org.jetbrains.anko:anko-recyclerview-v7:0.10.1'
implementation 'org.jetbrains.anko:anko-cardview-v7:0.10.1'

2.创建布局

Anko DSL几乎对Android SDK和Android支持库提供的每个小部件都具有帮助器功能。 使用它们,您可以以编程方式创建布局。 函数的名称与小部件的名称匹配,但是它们以小写字母开头。 例如,要创建TextView小部件,请使用Anko的textView()函数。 同样,要创建FloatingActionButton小部件,可以使用floatingActionButton()函数。

在函数内部,您将有权访问关联小部件的所有属性和事件侦听器。 例如,您可以通过更新textView()函数内的textSize属性的值来更改TextView小部件的文本大小。 同样,您可以使用onClick方法向其添加单击事件监听器。

为了帮助您更好地了解如何使用DSL,这是浏览器应用程序的示例布局,其中包含EditText小部件和放置在LinearLayout小部件内的WebView小部件,其方向为VERTICAL

linearLayout {
    orientation = LinearLayout.VERTICAL

    var myWebView:WebView? = null

    editText {
        inputType = InputType.TYPE_TEXT_VARIATION_URI
        imeOptions = EditorInfo.IME_ACTION_GO
        onEditorAction { _, _, _ ->
            myWebView?.loadUrl(text.toString())
        }
    }

    myWebView = webView {
        webViewClient = WebViewClient()
    }
}

用Anko DSL编写的代码非常易读和直观,但是确实需要一些习惯,特别是如果您已经是一位经验丰富的Android开发人员。 您不再需要为窗口小部件分配标识符,也不必使用findViewById()方法来引用它们,因为与基于XML的布局不同,Anko基于DSL的布局可以封装应用程序的业务逻辑。 例如,您可以看到上面定义的EditText小部件具有一个OnEditorAction事件侦听器,该事件侦听器直接调用WebView小部件的loadUrl()方法以加载用户键入的URL。

此外,您不再需要调用setContentView()方法,因为Anko会在Activity类的onCreate()方法中自动调用它。

DSL包含一些快捷方式,您可以使用它们来简化布局。 例如,您可以直接将字符串传递给它的函数,以将标签分配给小部件。 通常,您还可以避免显式设置布局参数,例如宽度和高度,因为它会自动处理它们。 下面的示例代码向您展示如何以高度简洁的方式创建一个包含两个TextView小部件的布局:

verticalLayout {
    textView("One")
    textView("Two")
}

为了进行比较,如果按常规方式创建,则上述布局如下所示:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="https://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="One"/>
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Two"/>
</LinearLayout>

最后,值得一提的是,使用Anko DSL创建的布局往往比常规布局加载得更快,因为不需要XML解析。

3.创建对话框

如果您认为使用AlertDialog.Builder类创建对话框需要大量工作,那么您肯定并不孤单。 例如,以下是通常创建一个简单的对话框的对话框,该对话框显示标题,消息和“确定”按钮:

AlertDialog.Builder(this@MyActivity)
            .setTitle("My Dialog")
            .setMessage("This is a test message")
            .setPositiveButton("OK", null)
            .create()
            .show()

但是,使用Anko,创建上述对话框仅涉及对alert()函数的调用,该函数接受对话框的标题和消息作为其参数。

alert("This is a test message", "My Dialog") {
    yesButton {  }
}.show()

请注意,您不必将上下文传递给alert()函数。 它自动推断上下文。

Anko具有类似的直观命名功能,可帮助您快速创建吐司和小吃店。 以下代码向您展示了如何创建短时和长时吐司:

toast("This is a short toast")
longToast("And this is a long toast")

4.创建意图

每当需要在应用程序中启动新活动时,都必须创建一个意图。 此外,如果要向活动发送数据,则必须将其作为一个或多个附加项包含在意图中。

使用Anko的startActivity()函数,通常可以仅用一行代码执行两项任务。 例如,下面的代码向您展示如何启动名为MyActivity的活动, MyActivity其传递两个附加字符,一个附加字符串“ PERSON”和一个整数附加“ AGE”:

startActivity<MyActivity>("PERSON" to "Bob", "AGE" to 25)

Anko还具有帮助程序功能,可以执行多个基于意图的常见任务。 例如,您可以使用其browser browse()函数在设备的默认浏览器应用程序中打开URL。 同样,您可以使用email()函数打开默认的电子邮件应用程序并撰写电子邮件。

// Open browser
browse("https://tutsplus.com")

// Open default E-mail app
email("bob@example.com", "Hello", "This is a test email")

5.使用SQLite数据库

即使每个Android应用程序都可以创建和使用没有附加依赖项的SQLite数据库,许多开发人员还是选择了Realm之类的第三方数据库。 为什么? 嗯,也许是因为Android的SQLite API非常冗长,底层,并且需要对SQL有很好的理解。 幸运的是,Anko具有SQLite帮助器功能来解决所有这些问题。

假设我们有一个使用以下代码创建的简单SQLite数据库:

val myDB = openOrCreateDatabase("test.db", 
                        Context.MODE_PRIVATE, null)

使用Anko,您现在可以简单地通过使用createTable()函数将表添加到上述数据库中,该函数需要该表的名称以及一个或多个指定其列的名称和数据类型的元组。 以下示例代码创建一个名为PERSON表,该表具有四列,其中一列用作主键:

myDB.createTable("PERSON", true,
        "NAME" to TEXT,
        "AGE" to INTEGER,
        "NET_WORTH" to REAL,
        "ID" to INTEGER + PRIMARY_KEY)

此外,要将行插入表中,您不再需要依赖ContentValues()类。 您可以直接在数据库上调用insert()函数,指定要将行添加到的表的名称,然后以元组的形式将列值传递给它。

// Add a row
myDB.insert("PERSON",
        "NAME" to "Bob Martin",
        "AGE" to 25,
        "NET_WORTH" to 2500.50,
        "ID" to 100)

// Add another row
myDB.insert("PERSON",
        "NAME" to "Jane Flores",
        "AGE" to 32,
        "NET_WORTH" to 21500.80,
        "ID" to 101)

最后,要查询数据库,可以使用select()函数,还可以select()使用一系列直观命名的函数,例如whereSimple()orderBy()groupBy() 。 例如,要列出上表中所有净资产大于10000人员的姓名和年龄,可以使用以下代码:

myDB.select("PERSON", "NAME", "AGE")
        .whereSimple("NET_WORTH > ?", "10000.0").exec {
    // More code here
}

如您所料,上述查询的结果将是一个Cursor对象。 将其转换为包含所有行的实际列值的List会稍微复杂一些,因为它涉及创建一个实现RowParser接口的对象并将其传递给parseList()函数。

RowParser接口只有一个方法parseRow()方法,在其中可以访问行的列值。 当然,如何使用这些值取决于您。 现在,让我们连接它们并打印它们。 以下代码显示了如何执行此操作:

parseList(object: RowParser<String>{
    override fun parseRow(columns: Array<Any?>): String {
        // Concatenate the values of the first and second columns,
        // which happen to be NAME and AGE
        return "${columns[0]} (${columns[1]} years old)"
    }
}).forEach {
    println(it) // print the concatenated values
}

// Result is:
// Jane Flores (32 years old)

请注意,您不必总是手动创建RowParser对象。 如果查询的结果仅包含一列,则可以自由使用Anko的许多内置解析器之一。

内置解析器的名称基于列的数据类型。 例如,如果数据类型为TEXT ,则可以使用StringParser 。 或者,如果数据类型为INTEGER ,则可以使用IntParser 。 以下代码显示了如何使用StringParser来简单列出数据库中所有人的姓名:

myDB.select("PERSON", "NAME").exec {
    parseList(StringParser).forEach {
        println(it)
    }
}

// Result is:
// Bob Martin
// Jane Flores

结论

在本教程中,您学习了如何使用Anko的DSL和帮助器功能来简化Android应用程序开发。 您还看到了Anko如何简化与SQLite相关的操作。 我希望您现在意识到图书馆是经过深思熟虑和有用的。

我认为,如果您已经具备了Kotlin的能力,那么实际上就没有理由不应该使用Anko来进一步提高效率和开发经验。 要了解更多信息,请参阅其官方Wiki

当您在这里时,请查看我们有关Kotlin和Android应用程序开发的其他一些帖子!

翻译自: https://code.tutsplus.com/tutorials/simplify-android-app-development-with-anko--cms-30005

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值