之前的一篇文章写的比较早。我们简单了解了Kotlin这门新语言的优点,也接触到了一些常用语法及其简单使用。相信你会明白对它有浓厚的兴趣,暂且理解为对它感兴趣吧,哈哈哈。那么,我们如何在Android中应用这种新语言呢?今天的文章将带大家学习如何使用Kotlin开发Android应用,并与我们传统的语言Java进行对比,让你真正感受到它的美丽与优雅。配置项目gradle文件applyplugin:'com.android.application'applyplugin:'kotlin-android'applyplugin:'kotlin-android-extensions'dependencies{classpath'org.jetbrains.kotlin:kotlin-gradle-plugin:1.1.1'}appGradle文件:compile'org.jetbrains.kotlin:kotlin-stdlib:1.1.1'compile'org.jetbrains.anko:anko-sdk25:0.10.0-beta-1'//sdk15,sdk19,sdk21,sdk23都是也可用compile'org.jetbrains.anko:anko-appcompat-v7:0.10.0-beta-1'Anko通过上面的配置,你会发现引入了anko依赖。Anko是JetBrains开发的一个强大的库。说到JetBrains,它很棒。Kotlin语言就是他们开发的。最先进的开发工具intellijidea就是他们开发的。AS也是基于IDEA的。好了,言归正传,Anko是Kotlin官方开发的一个Kotlin库,可以让开发Android应用程序变得更快更简单,让我们写的代码更简单、更清晰、更易读。它包括多个部分,如下:AnkoCommons:一个轻量级的库,里面有很多用于意图、对话框、日志记录等的助手;AnkoLayouts:一个快速和类型安全的方式来编写动态的Android布局;AnkoSQLite:一个queryDSLandparsercollectionforAndroidSQLite;AnkoCoroutines:基于kotlinx.coroutines库的实用程序接下来,我们将通过语言开发来了解AndroidKotlin的优势。做过Android开发没有用过findViewById的都知道,findViewById在布局文件写的太多的时候也是很费劲的,需要先声明变量,然后在findViewById中强制进入我们的控件,一般使用如下TextViewusername;username=(TextView)findViewById(R.id.user);username.setText("我是TextView");有时候想吐,可能有人会说现在没有一些注解的库,比如butterknife,我们用注解的时候不需要findViewById。使用方法如下@BindView(R.id.user)TextViewusername;这需要一些工作,但这仍然不是最简单的。最简单的就是我们可以直接给id为user的控件赋值。你可能会觉得这有点不可思议。但科特林确实如此。我们可以直接写user.text="我是一个TextView",看看有没有一种相见恨晚的感觉,多摩太简洁了。user是我们布局文件中声明的id,.text是要给setText()的。在Kotlin语言中,我们看不到Java中的set/get方法。需要注意的是,当我们要这样使用时(没有findViewById,需要在gradle中添加applyplugin:'kotlin-android-extensions'才能直接使用xml控件),需要添加如下一行代码//activity_login是我们的layoutimportkotlinx.android.synthetic.main.activity_login.*AnkoLayout通常我们使用xml文件来写我们的layout,但是它有一些缺点比如不是类型安全的,不是null安全的,解析xml文件消耗更多的CPU和功率,等等。而AnkoLayout可以使用DSL来动态创建我们的UI,比我们使用Java动态创建布局要方便很多,主要是它更简洁,而且它和xml创建布局有层级关系,这样更容易我们去读书。verticalLayout{valtextView=textView("我是TextView")valname=editText("EditText")button("Button"){onClick{toast("${name.text}!")}}}我们在OnCreatemethod可以去掉setContentView,然后加入上面的代码,显示效果如下图所示,即一个TextView,一个EditText,一个Button被放置在一个垂直的线性布局中。而Button中有一个点击事件,点击时,toast中会显示EditText的内容。上面的代码是不是很简单易懂?当然,默认的控件不能满足我们的需求。例如,我们将更改字体的颜色和大小,设置宽度和高度,并设置边距和填充值。那么如何实施呢?,当然也很简单,因为它的逻辑和xml写布局都是套路。比如下面的实现valtextView=textView("我是一个TextView"){textSize=sp(17).toFloat()textColor=context.resources.getColor(R.color.red)}.lparams{margin=dip(10)height=dip(40)width=matchParent}上面的代码我觉得不用解释了,大家应该看看控件实现的效果吧。因为它的属性对应着我们在xml中设置的名称。在上面创建UI的过程中,我们直接在onCreate方法中编写了创建UI的代码。当然还有另一种写法。我们创建一个实现AnkoComponent接口的内部类并覆盖createView方法,该方法返回一个视图,这是我们创建的布局。修改innerclassUI如下:AnkoComponent{overridefuncreateView(ui:AnkoContext):View{returnwith(ui){verticalLayout{valtextView=textView("我是一个TextView"){textSize=sp(17).toFloat()textColor=context.resources.getColor(R.color.red)}.lparams{margin=dip(10)height=dip(40)width=matchParent}valname=editText("EditText")按钮("按钮"){onClick{view->toast("Hello,${name.text}!")}}}}}}然后在onCreate方法中加入一行代码来创建我们的布局页面。下面的UI().setContentView(this@LoginActivity)现在我们编译运行,发现效果和布局文件中写的界面是一样的。但是它的性能是有优势的,实际上它并没有找到性能优势。总之,这种DSL确实是易读易用。在上面的代码中,你可能注意到dip(10),也就是将10dp转换为像素,是Anko的扩展函数,表示扩展函数,如果我们阅读Anko的源码,就会发现大量的扩展函数是用在里面,这也是Kotlin语言的优势之一。真的很强大,比如dipextension(extractViewextension)inlinefunView.dip(value:Int):Int=context.dip(value)funContext.dip(value:Int):Int=(value*resources.displayMetrics.density)。resources.displayMetrics.density上面的toInt()和我们Java的getResources().getDisplayMetrics().density的效果是一样的,但是看了会觉得比Java写的舒服,反正我是这么觉得的。上面我们给Button添加了一个点击事件,我们发现它支持lambda表达式。我们要显示一个Toast,只需要toast("content"),是不是很简洁。其实也是一个扩展函数,实现inlinefunAnkoContext<*>.toast(message:CharSequence)=ctx.toast(message)funContext.toast(message:CharSequence)=Toast.makeText(this,message,Toast.LENGTH_SHORT).show()当然,创建对话框还是很简单的,如下:alert("我是Dialog"){yesButton{toast("yes")}noButton{toast("no")}}.show()真的是看着舒服多了,哈哈。这里再介绍一个功能强大又不失简洁的代码实现。doAsync{//后台执行代码uiThread{//UI线程toast("Thread${Thread.currentThread().name}")}}这段代码实现了AsyncTask的效果,但是你应该会发现它比Java的实现要简洁的多,当然除非你是色盲,否则你会看到简洁。如果你使用Kotlin开发Android一段时间,你会发现它为我们减少了很多代码量。当然,更多的优点和用法还需要我们自己去探索。相信探索后会让你大吃一惊。实现一个简单的登录界面接口很简单,伪代码按钮登录/>看起来并不复杂,这里就不贴出xml实现的代码了,如果你想看xml实现可以查看和检查,那就看Anko用Kotlin代码实现这个布局。lateinitvaret_account:EditTextlateinitvaret_password:EditTextinnerclassLoginUi:AnkoComponent{overridefuncreateView(ui:AnkoContext)=with(ui){verticalLayout{backgroundColor=context.resources.getColor(android.R.color.white)重力=Gravity.CENTER_HORIZONTALimageView(R.mipmap.ic_launcher).lparams{width=dip(100)height=dip(100)topMargin=dip(64)}linearLayout{gravity=Gravity.CENTER_VERTICALorientation=HORIZONTALbackgroundResource=R.drawable.bg_frame_cornerimageView{image=resources.getDrawable(R.mipmap.ic_username)}.lparams(width=wrapContent,height=wrapContent){leftMargin=dip(12)rightMargin=dip(15)}et_account=editText{hint="登录账户"hintTextColor=Color.parseColor("#666666")textSize=16fbackground=null}}.lparams(width=dip(300),height=dip(40)){topMargin=dip(45)}linearLayout{orientation=HORIZONTALbackgroundResource=R.drawable.bg_frame_cornergravity=Gravity.CENTER_VERTICALimageView{image=resources.getDrawable(R.mipmap.ic_password)}.lparams{leftMargin=dip(12)rightMargin=dip(15)}et_password=editText{hint="登录密码"hintTextColor=Color.parseColor("#666666")textSize=16fbackground=null}}.lparams{width=dip(300)height=dip(40)topMargin=dip(10)}button("login"){gravity=Gravity.CENTERbackground=resources.getDrawable(R.drawable.bg_login_btn)textColor=Color.parseColor("#ffffff")onClick{if(et_account.text.toString().isNotEmpty()&&et_password.text.toString().isNotEmpty())startActivity()elsetoast("请输入账号或密码")}}.lparams(width=dip(300),height=dip(44)){topMargin=dip(18)}linearLayout{orientation=HORIZONTALgravity=Gravity.CENTER_VERTICALcheckBox("记住密码"){textColor=Color.parseColor("#666666")textSize=16fleftPadding=dip(5)}textView("隐私协议"){textColor=Color.parseColor("#1783e3")gravity=Gravity.RIGHTtextSize=16f}.lparams(width=matchParent)}.lparams(width=dip(300)){topMargin=dip(18)}textView("Copyright?Code4Android"){textSize=14fgravity=Gravity.CENTERorGravity.BOTTOM}.lparams{bottomMargin=dip(35)weight=1f}}}}看看上面的代码怎么样,看起来还不错,就算现在不会写,也能读一读。上面我们为登录按钮设置了一个事件来打开MainActivity。startActivity里面写的就是我们要跳转到的Activity。如果给打开的接口传递参数,直接写在()中。比如我们将输入的账号和密码传递给跳转界面,就会实现为startActivity("account"toet_account.text.toString(),"password"toet_password.text.toString())中其实,Anko强大的地方远不止于此,值得细细品味。如果你想了解更多,可以去GitHubAnko(https://github.com/Kotlin/anko)。至此,本文结束。如果您在阅读过程中发现任何错误,请指出。谢谢。祝你有美好的一天。