詳解Kotlin和anko融合進(jìn)行Android開(kāi)發(fā)
kotlin是一門(mén)基于jvm的編程語(yǔ)言,最近進(jìn)行了關(guān)于kotlin和 anko的研究。并且結(jié)合現(xiàn)在的APP設(shè)計(jì)模式,設(shè)想了初步的開(kāi)發(fā)方式。并且準(zhǔn)備應(yīng)用在新的項(xiàng)目中。
Kotlin和anko
Kotlin是大名鼎鼎的JB公司開(kāi)發(fā)的jvm語(yǔ)言,官網(wǎng)地址為;http://kotlinlang.org/
官網(wǎng)的介紹為:
Statically typed programming language for the JVM, Android and the browser
Kotlin的設(shè)計(jì)思想非常的輕量,盡可能的去復(fù)用java代碼,不到萬(wàn)不得已的時(shí)候,一般不會(huì)自己去實(shí)現(xiàn)一套大而全的庫(kù)。這使得Kotlin非常的輕量,集成到Android的project并不會(huì)很明顯的影響最終的打包大小。
關(guān)于Kotlin的優(yōu)點(diǎn),自己總結(jié)了幾點(diǎn):
1,和Java的無(wú)縫調(diào)用,這在初期不需要投入非常大的精力,即使遇到搞不定的坑,也不必?fù)?dān)心影響業(yè)務(wù)開(kāi)發(fā)的進(jìn)度,直接換成java就好了。
2,大量的語(yǔ)法糖,使得代碼非常的簡(jiǎn)潔,熟悉之后的開(kāi)發(fā)效率也要高于Java。例如擴(kuò)展函數(shù),簡(jiǎn)單的封裝再也不需要寫(xiě)一大堆Utils工具類(lèi),直接靈活的給某些類(lèi)添加擴(kuò)展方法就可以了。例如:
inline fun Activity.toast(message : Int) {
Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
}
這樣在Activity類(lèi)中就多出了一個(gè)toast方法,實(shí)際上在anko中,也有大量已經(jīng)寫(xiě)好的擴(kuò)展方法,可以直接使用DSL語(yǔ)法去寫(xiě)UI。再例如when語(yǔ)句的寫(xiě)法:
when(x) {
1-> {}
2-> {}
}
很明顯,相比傳統(tǒng)的Java寫(xiě)法,使用anko后,語(yǔ)言更加簡(jiǎn)潔。
switch(x) {
case 1:
break;
case 2:
break;
default:
break;
}
3,更加安全,Kotlin似乎比較想消滅空引用,在Java中,調(diào)用一個(gè)null對(duì)象會(huì)拋出NullPointException,在Kotlin中,不能為空的對(duì)象,例如String對(duì)象,會(huì)寫(xiě)成:
var a: String? = "abc"
4,良好的生態(tài)環(huán)境和開(kāi)發(fā)社區(qū)。Kotlin目前還是屬于比較新的技術(shù),很多人也都在嘗試它的有點(diǎn)。包括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文件里面添加依賴(lài):
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"
根據(jù)kotlin的優(yōu)勢(shì),選擇使用anko進(jìn)行編寫(xiě),不使用xml進(jìn)行編寫(xiě)。
這樣的好處在anko的github README文件中是這樣描述的:
- 不安全
- 沒(méi)有空安全
- 迫使你為了每一個(gè)布局去寫(xiě)很多相似甚至重復(fù)的代碼
- XML在設(shè)備上浪費(fèi)CPU時(shí)間和電量(應(yīng)該是需要進(jìn)行解析的原因) 不允許代碼重用(沒(méi)有完全理解,可能說(shuō)的不是include標(biāo)簽而是自定義的layout)
- 至于Contract接口以及實(shí)體對(duì)象,可以直接使用Kotlin編寫(xiě),第一為了語(yǔ)法簡(jiǎn)潔,第二不用寫(xiě)一大堆setter/getter方法。
具體的,首先編寫(xiě)MainActivity類(lèi),進(jìn)行UI展示和事件等邏輯。
class MainActivity : AppCompatActivity(), MainContract.View {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
}
接下來(lái)在onCreate中編寫(xiě)ui布局,登錄布局比較簡(jiǎn)單,就是2個(gè)輸入框和一個(gè)按鈕,當(dāng)然為了試用多點(diǎn)的常見(jiàn)控件,我在最上方添加了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 = "請(qǐng)輸入同戶(hù)名"
maxLines=1
lparams {
width = matchParent
height = wrapContent
margin=dip(8)
centerInParent()
}
}
var mPsdEdit = editText {
id= ID_PSD_EDIT
hint="請(qǐng)輸入密碼"
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中沒(méi)有static的概念,但是有一個(gè)companion object(伴隨對(duì)象)可以模擬實(shí)現(xiàn)類(lèi)似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
}
可以看到,這樣編寫(xiě)UI的代碼非常的簡(jiǎn)潔。而且可讀性非常的高。相信對(duì)XML寫(xiě)布局比較熟悉的同學(xué)都能看懂這里面代碼的含義。同時(shí)官方還出了一個(gè)Android Stduio插件,叫做anko SDL preview。可以很方便的讓開(kāi)發(fā)者預(yù)覽編寫(xiě)的效果。接下來(lái)按照MVP的思想, 編寫(xiě)B(tài)aseView和BasePresenter接口。
interface BaseView<T> {
fun setPresenter(presenter: T)
}
interface BasePresenter
使用Kotlin編寫(xiě)MainContract接口,這個(gè)接口建立起了V層和P層的通信。
interface MainContract {
interface View : BaseView<Presenter> {
fun login()
fun loginNUll()
}
interface Presenter : BasePresenter {
fun login(username: String, password: String)
}
}
使用Java編寫(xiě)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();
}
}
這里只是模擬了下登錄的邏輯,并沒(méi)有去真的實(shí)現(xiàn)一個(gè)登錄
回到MainActivity,在這里加入我們的代碼。
var mPresenter : MainContract.Presenter? = null
override fun setPresenter(presenter: MainContract.Presenter) {
mPresenter = presenter!!
}
實(shí)現(xiàn)V層應(yīng)該實(shí)現(xiàn)的回調(diào)方法:
override fun loginNUll() {
toast("用戶(hù)名密碼不得為空")
}
override fun login() {
toast("執(zhí)行登錄邏輯...")
}
到這里,我們就完成了Kotlin和anko開(kāi)發(fā)Android的實(shí)例,如果想要更加熟練的使用,還需要多加練習(xí)。
附:Anko的github地址為https://github.com/Kotlin/anko
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
關(guān)于Hadoop中Spark?Streaming的基本概念
這篇文章主要介紹了關(guān)于Hadoop中Spark?Streaming的基本概念,Spark?Streaming是構(gòu)建在Spark上的實(shí)時(shí)計(jì)算框架,它擴(kuò)展了Spark處理大規(guī)模流式數(shù)據(jù)的能力,Spark?Streaming可結(jié)合批處理和交互式查詢(xún),需要的朋友可以參考下2023-07-07
Java利用Swagger2自動(dòng)生成對(duì)外接口的文檔
這篇文章主要介紹了Java利用Swagger2自動(dòng)生成對(duì)外接口的文檔,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-06-06
springboot實(shí)現(xiàn)maven多模塊和打包部署
本文主要介紹了springboot實(shí)現(xiàn)maven多模塊和打包部署,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04
如何使用Java語(yǔ)言編寫(xiě)打地鼠游戲全過(guò)程
打地鼠是我們非常熟悉的一款小游戲,它的游戲結(jié)構(gòu)和規(guī)則也都比較簡(jiǎn)單,那么如果能夠親自徒手開(kāi)發(fā)這樣的一款經(jīng)典小游戲呢?這篇文章主要給大家介紹了關(guān)于如何使用Java語(yǔ)言編寫(xiě)打地鼠游戲的相關(guān)資料,需要的朋友可以參考下2024-06-06
Java并發(fā)編程之線程池實(shí)現(xiàn)原理詳解
池化思想是一種空間換時(shí)間的思想,期望使用預(yù)先創(chuàng)建好的對(duì)象來(lái)減少頻繁創(chuàng)建對(duì)象的性能開(kāi)銷(xiāo),java中有多種池化思想的應(yīng)用,例如:數(shù)據(jù)庫(kù)連接池、線程池等,下面就來(lái)具體講講2023-05-05
springcloud下hibernate本地化方言配置方式
這篇文章主要介紹了springcloud下hibernate本地化方言配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09

