由Kotlin背后的组织JetBrains设计的Anko是一个开源库,可以从根本上改变您创建Android应用程序的方式。 它利用Kotlin的语法提供了大量的辅助函数,可以帮助您减少代码的冗长性,同时还可以提高其性能。
Anko可以兼作DSL,是领域特定语言的缩写,用于创建Android布局。 换句话说,它可以作为布局XML文件的一种类型安全,动态且可重用的替代方法,您可能已经知道,布局XML文件对于大型应用程序往往很笨拙。
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("", "Hello", "This is a test email")
5.使用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
结论
我认为,如果您已经具备了Kotlin的能力,那么实际上就没有理由不应该使用Anko来进一步提高效率和开发经验。 要了解更多信息,请参阅其官方Wiki 。
当您在这里时,请查看我们有关Kotlin和Android应用程序开发的其他一些帖子!
翻译自: https://code.tutsplus.com/tutorials/simplify-android-app-development-with-anko--cms-30005

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/25942.html