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文件中是這樣描述的:
具體的,首先編寫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<T> {
fun setPresenter(presenter: T)
}
interface BasePresenter
使用Kotlin編寫MainContract接口,這個接口建立起了V層和P層的通信。
interface MainContract {
interface View : BaseView<Presenter> {
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
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。