热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

详解Kotlin和anko融合进行Android开发

kotlin是一门基于jvm的编程语言,最近进行了关于kotlin和 anko的研究。并且结合现在的APP设计模式,设想了初步的开发方式。并

kotlin是一门基于jvm的编程语言,最近进行了关于kotlin和 anko的研究。并且结合现在的APP设计模式,设想了初步的开发方式。并且准备应用在新的项目中。

Kotlin和anko

Kotlin是大名鼎鼎的JB公司开发的jvm语言,官网地址为;http://kotlinlang.org/

官网的介绍为:

Statically typed programming language for the JVM, Android and the browser

Kotlin的设计思想非常的轻量,尽可能的去复用java代码,不到万不得已的时候,一般不会自己去实现一套大而全的库。这使得Kotlin非常的轻量,集成到Android的project并不会很明显的影响最终的打包大小。

关于Kotlin的优点,自己总结了几点:

1,和Java的无缝调用,这在初期不需要投入非常大的精力,即使遇到搞不定的坑,也不必担心影响业务开发的进度,直接换成java就好了。

2,大量的语法糖,使得代码非常的简洁,熟悉之后的开发效率也要高于Java。例如扩展函数,简单的封装再也不需要写一大堆Utils工具类,直接灵活的给某些类添加扩展方法就可以了。例如:

inline fun Activity.toast(message : Int) {
   Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
 }

这样在Activity类中就多出了一个toast方法,实际上在anko中,也有大量已经写好的扩展方法,可以直接使用DSL语法去写UI。再例如when语句的写法:

when(x) {
1-> {}
2-> {}
}

很明显,相比传统的Java写法,使用anko后,语言更加简洁。

switch(x) {
case 1:
 break;
case 2:
 break;
default:
 break;
}

3,更加安全,Kotlin似乎比较想消灭空引用,在Java中,调用一个null对象会抛出NullPointException,在Kotlin中,不能为空的对象,例如String对象,会写成:

var a: String? = "abc" 

4,良好的生态环境和开发社区。Kotlin目前还是属于比较新的技术,很多人也都在尝试它的有点。包括Rx系列也出了RxKotlin,既RxJava的Kotlin版

Kotlin和Anko使用

Anko的github地址为https://github.com/Kotlin/anko。集成anko的步骤如下:

首先在project的build文件加入如下代码:

dependencies {
    classpath 'com.android.tools.build:gradle:2.2.3'
    classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" //这是需要你加入的
  }

allprojects {
  repositories {
    jcenter()
    maven {url 'https://dl.bintray.com/jetbrains/anko'} //这是你需要加入的
  }
}

然后,在你app moudle的build文件里面添加依赖:

compile "org.jetbrains.anko:anko-sdk15:0.9.1" // So here it's 15 too
  compile "org.jetbrains.anko:anko-appcompat-v7:0.9.1"
  compile "org.jetbrains.anko:anko-design:0.9.1"
  compile "org.jetbrains.anko:anko-recyclerview-v7:0.9.1"

根据kotlin的优势,选择使用anko进行编写,不使用xml进行编写。

这样的好处在anko的github README文件中是这样描述的:

  1. 不安全
  2. 没有空安全
  3. 迫使你为了每一个布局去写很多相似甚至重复的代码
  4. XML在设备上浪费CPU时间和电量(应该是需要进行解析的原因) 不允许代码重用(没有完全理解,可能说的不是include标签而是自定义的layout)
  5. 至于Contract接口以及实体对象,可以直接使用Kotlin编写,第一为了语法简洁,第二不用写一大堆setter/getter方法。

具体的,首先编写MainActivity类,进行UI展示和事件等逻辑。

class MainActivity : AppCompatActivity(), MainContract.View {
  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
  }
}

接下来在onCreate中编写ui布局,登录布局比较简单,就是2个输入框和一个按钮,当然为了试用多点的常见控件,我在最上方添加了Toolbar。

relativeLayout {

      var mToolbar =
      toolbar(R.style.Base_ThemeOverlay_AppCompat_Dark_ActionBar) {
        id = ID_TOOLBAR
        title = "登录"
        backgroundColor = ContextCompat.getColor(this@MainActivity, R.color.colorPrimary)

        popupTheme = R.style.Base_ThemeOverlay_AppCompat_Light
        inflateMenu(R.menu.main)

        setNavigationIcon(R.mipmap.img_back_white)

        onMenuItemClick {
          menuItem ->
          val itemId = menuItem!!.itemId
          when (itemId) {
            R.id.menu_main -> {
              toast(R.string.main_toast)
            }
          }
          false
          }

        lparams {
          width = matchParent
          height = wrapContent
        }

        setNavigationOnClickListener {
          finish()
        }
      }

      var mUserEdit = editText {
        id = ID_USER_EDIT
        hint = "请输入同户名"
        maxLines=1

        lparams {
          width = matchParent
          height = wrapContent
          margin=dip(8)
          centerInParent()
        }
      }

      var mPsdEdit = editText {
        id= ID_PSD_EDIT
        hint="请输入密码"
        maxLines=1
        maxWidth = 16

        lparams {
          width = matchParent
          height = wrapContent
          margin = dip(8)
          below(ID_USER_EDIT)
        }
      }


      var mButton = button("登录") {
        id= ID_BTN_LOGIN

        onClick {
          var username = mUserEdit.text.toString()
          var password = mPsdEdit.text.toString()

          mPresenter!!.login(username,password)
        }

        lparams {
          width= matchParent
          height = wrapContent
          margin = dip(8)
          below(ID_PSD_EDIT)
        }
      }
    }

代码中的id使用了常量,在Kotlin中没有static的概念,但是有一个companion object(伴随对象)可以模拟实现类似static的功能。

companion object static {
    val ID_TOOLBAR: Int = 1
    val ID_USER_EDIT: Int = 2
    val ID_PSD_EDIT: Int = 3
    val ID_BTN_LOGIN: Int = 4
  }

可以看到,这样编写UI的代码非常的简洁。而且可读性非常的高。相信对XML写布局比较熟悉的同学都能看懂这里面代码的含义。同时官方还出了一个Android Stduio插件,叫做anko SDL preview。可以很方便的让开发者预览编写的效果。接下来按照MVP的思想, 编写BaseView和BasePresenter接口。

interface BaseView {
  fun setPresenter(presenter: T)
}
interface BasePresenter

使用Kotlin编写MainContract接口,这个接口建立起了V层和P层的通信。

interface MainContract {
  interface View : BaseView {
    fun login()
    fun loginNUll()
  }

  interface Presenter : BasePresenter {
    fun login(username: String, password: String)
  }
}

使用Java编写P层代码。

public class MainPresenter implements MainContract.Presenter {

  private MainContract.View mView;

  public MainPresenter(MainContract.View view) {
    mView = view;
    mView.setPresenter(this);
  }

  @Override
  public void login(String username, String password) {
    if (TextUtils.isEmpty(username) || TextUtils.isEmpty(password)) {
      mView.loginNUll();
      return;
    }
    mView.login();
  }
}

这里只是模拟了下登录的逻辑,并没有去真的实现一个登录

回到MainActivity,在这里加入我们的代码。

var mPresenter : MainContract.Presenter? = null
override fun setPresenter(presenter: MainContract.Presenter) {
  mPresenter = presenter!!
}

实现V层应该实现的回调方法:

override fun loginNUll() {
  toast("用户名密码不得为空")
}

override fun login() {
  toast("执行登录逻辑...")
}

到这里,我们就完成了Kotlin和anko开发Android的实例,如果想要更加熟练的使用,还需要多加练习。

附:Anko的github地址为https://github.com/Kotlin/anko

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • TortoiseSVN与VisualSVN Server的安装及基本操作指南
    本文详细介绍了如何安装VisualSVN Server以及TortoiseSVN客户端,并提供了基本的操作步骤,包括配置仓库、用户管理及权限设置等关键环节。 ... [详细]
  • Win10 UWP 开发技巧:利用 XamlTreeDump 获取 XAML 元素树
    本文介绍如何在 Win10 UWP 开发中使用 XamlTreeDump 库来获取和转换 XAML 元素树为 JSON 字符串,这对于 UI 单元测试非常有用。 ... [详细]
  • Barbican 是 OpenStack 社区的核心项目之一,旨在为各种环境下的云服务提供全面的密钥管理解决方案。 ... [详细]
  • Spring Cloud Config 使用 Vault 作为配置存储
    本文探讨了如何在Spring Cloud Config中集成HashiCorp Vault作为配置存储解决方案,基于Spring Cloud Hoxton.RELEASE及Spring Boot 2.2.1.RELEASE版本。文章还提供了详细的配置示例和实践建议。 ... [详细]
  • 本文探讨了Web开发与游戏开发之间的主要区别,旨在帮助开发者更好地理解两种开发领域的特性和需求。文章基于作者的实际经验和网络资料整理而成。 ... [详细]
  • LCUI 2.1.0 版本现已推出,这是一个用 C 语言编写的图形用户界面开发库,适合创建轻量级的桌面应用程序。此次更新包括多项修复和功能增强,并正式宣布将启动 Android 支持的开发计划。 ... [详细]
  • 深入浅出TensorFlow数据读写机制
    本文详细介绍TensorFlow中的数据读写操作,包括TFRecord文件的创建与读取,以及数据集(dataset)的相关概念和使用方法。 ... [详细]
  • 本文将带您了解Cocos家族的不同版本和分支,特别是Cocos Creator的发展历程及其核心特性,帮助初学者快速入门。 ... [详细]
  • HTTPS与TLS/SSL协议详解:握手及记录协议
    HTTPS,即HTTP over TLS/SSL,通过在HTTP通信层引入安全协议,确保数据传输的安全性。本文将深入探讨TLS/SSL协议的基本概念、HTTPS的必要性,以及TLS握手和记录协议的工作原理。 ... [详细]
  • 1、字符型常量字符型常量指单个字符,是用一对单引号及其所括起来的字符表示。例如:‘A’、‘a’、‘0’、’$‘等都是字符型常量。C语言的字符使用的就是 ... [详细]
  • 在Windows Server 2008 R2上配置IIS FTP服务
    本文详细介绍了如何在Windows Server 2008 R2操作系统上通过IIS配置FTP服务的过程,包括服务器角色的选择与安装、FTP站点的创建以及必要的服务和防火墙设置检查。 ... [详细]
  • 本文将指导您如何在Docker环境中高效地搜索、下载Redis镜像,并通过指定或不指定配置文件的方式启动Redis容器。同时,还将介绍如何使用redis-cli工具连接到您的Redis实例。 ... [详细]
  • 利用YAML配置Resilience4J的Circuit Breaker
    本文探讨了Resilience4j作为现代Java应用程序中不可或缺的容错工具,特别介绍了如何通过YAML文件配置Circuit Breaker以提高服务的弹性和稳定性。 ... [详细]
  • 本改进旨在提升运行选择器中名称换行的显示效果,以提高用户体验。 ... [详细]
  • 本文详细介绍了如何通过Git Bash在本地仓库与远程仓库之间建立连接并进行同步操作,包括克隆仓库、提交更改和推送更新等步骤。 ... [详细]
author-avatar
天秤aaaaaaa_150
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有