欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Kotlin和anko融合進(jìn)行Android開發(fā)

 更新時(shí)間:2017年11月10日 14:26:57   作者:code_xzh  
本篇文章主要介紹了Kotlin和anko融合進(jìn)行Android開發(fā),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

kotlin是一門基于jvm的編程語(yǔ)言,最近進(jìn)行了關(guān)于kotlin和 anko的研究。并且結(jié)合現(xiàn)在的APP設(shè)計(jì)模式,設(shè)想了初步的開發(fā)方式。并且準(zhǔn)備應(yīng)用在新的項(xiàng)目中。

Kotlin和anko

Kotlin是大名鼎鼎的JB公司開發(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代碼,不到萬不得已的時(shí)候,一般不會(huì)自己去實(shí)現(xiàn)一套大而全的庫(kù)。這使得Kotlin非常的輕量,集成到Android的project并不會(huì)很明顯的影響最終的打包大小。

關(guān)于Kotlin的優(yōu)點(diǎn),自己總結(jié)了幾點(diǎn):

1,和Java的無縫調(diào)用,這在初期不需要投入非常大的精力,即使遇到搞不定的坑,也不必?fù)?dān)心影響業(yè)務(wù)開發(fā)的進(jìn)度,直接換成java就好了。

2,大量的語(yǔ)法糖,使得代碼非常的簡(jiǎn)潔,熟悉之后的開發(fā)效率也要高于Java。例如擴(kuò)展函數(shù),簡(jiǎn)單的封裝再也不需要寫一大堆Utils工具類,直接靈活的給某些類添加擴(kuò)展方法就可以了。例如:

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

這樣在Activity類中就多出了一個(gè)toast方法,實(shí)際上在anko中,也有大量已經(jīng)寫好的擴(kuò)展方法,可以直接使用DSL語(yǔ)法去寫UI。再例如when語(yǔ)句的寫法:

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

很明顯,相比傳統(tǒng)的Java寫法,使用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ì)寫成:

var a: String? = "abc" 

4,良好的生態(tài)環(huán)境和開發(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文件里面添加依賴:

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)行編寫,不使用xml進(jìn)行編寫。

這樣的好處在anko的github README文件中是這樣描述的:

  1. 不安全
  2. 沒有空安全
  3. 迫使你為了每一個(gè)布局去寫很多相似甚至重復(fù)的代碼
  4. XML在設(shè)備上浪費(fèi)CPU時(shí)間和電量(應(yīng)該是需要進(jìn)行解析的原因) 不允許代碼重用(沒有完全理解,可能說的不是include標(biāo)簽而是自定義的layout)
  5. 至于Contract接口以及實(shí)體對(duì)象,可以直接使用Kotlin編寫,第一為了語(yǔ)法簡(jiǎn)潔,第二不用寫一大堆setter/getter方法。

具體的,首先編寫MainActivity類,進(jìn)行UI展示和事件等邏輯。

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

接下來在onCreate中編寫ui布局,登錄布局比較簡(jiǎn)單,就是2個(gè)輸入框和一個(gè)按鈕,當(dāng)然為了試用多點(diǎ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)輸入同戶名"
        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中沒有static的概念,但是有一個(gè)companion object(伴隨對(duì)象)可以模擬實(shí)現(xiàn)類似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的代碼非常的簡(jiǎn)潔。而且可讀性非常的高。相信對(duì)XML寫布局比較熟悉的同學(xué)都能看懂這里面代碼的含義。同時(shí)官方還出了一個(gè)Android Stduio插件,叫做anko SDL preview??梢院芊奖愕淖岄_發(fā)者預(yù)覽編寫的效果。接下來按照MVP的思想, 編寫B(tài)aseView和BasePresenter接口。

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

使用Kotlin編寫MainContract接口,這個(gè)接口建立起了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();
  }
}

這里只是模擬了下登錄的邏輯,并沒有去真的實(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("用戶名密碼不得為空")
}

override fun login() {
  toast("執(zhí)行登錄邏輯...")
}

到這里,我們就完成了Kotlin和anko開發(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的基本概念

    這篇文章主要介紹了關(guān)于Hadoop中Spark?Streaming的基本概念,Spark?Streaming是構(gòu)建在Spark上的實(shí)時(shí)計(jì)算框架,它擴(kuò)展了Spark處理大規(guī)模流式數(shù)據(jù)的能力,Spark?Streaming可結(jié)合批處理和交互式查詢,需要的朋友可以參考下
    2023-07-07
  • Java利用Swagger2自動(dòng)生成對(duì)外接口的文檔

    Java利用Swagger2自動(dòng)生成對(duì)外接口的文檔

    這篇文章主要介紹了Java利用Swagger2自動(dòng)生成對(duì)外接口的文檔,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-06-06
  • Java AWT中常用的三種布局管理器詳解

    Java AWT中常用的三種布局管理器詳解

    這篇文章主要介紹了Java AWT中常用的三種布局管理器詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • springboot實(shí)現(xiàn)maven多模塊和打包部署

    springboot實(shí)現(xiàn)maven多模塊和打包部署

    本文主要介紹了springboot實(shí)現(xiàn)maven多模塊和打包部署,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • 如何使用Java語(yǔ)言編寫打地鼠游戲全過程

    如何使用Java語(yǔ)言編寫打地鼠游戲全過程

    打地鼠是我們非常熟悉的一款小游戲,它的游戲結(jié)構(gòu)和規(guī)則也都比較簡(jiǎn)單,那么如果能夠親自徒手開發(fā)這樣的一款經(jīng)典小游戲呢?這篇文章主要給大家介紹了關(guān)于如何使用Java語(yǔ)言編寫打地鼠游戲的相關(guān)資料,需要的朋友可以參考下
    2024-06-06
  • java中ThreadLocal的基本原理

    java中ThreadLocal的基本原理

    本文講解了java中ThreadLocal的一些基本原理,文中關(guān)于ThreadLocal的原理講解的非常詳細(xì),感興趣的朋友一起看看吧
    2021-08-08
  • 使用Spring自定義命名空間

    使用Spring自定義命名空間

    這篇文章主要介紹了使用Spring自定義命名空間方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java并發(fā)編程之線程池實(shí)現(xiàn)原理詳解

    Java并發(fā)編程之線程池實(shí)現(xiàn)原理詳解

    池化思想是一種空間換時(shí)間的思想,期望使用預(yù)先創(chuàng)建好的對(duì)象來減少頻繁創(chuàng)建對(duì)象的性能開銷,java中有多種池化思想的應(yīng)用,例如:數(shù)據(jù)庫(kù)連接池、線程池等,下面就來具體講講
    2023-05-05
  • springcloud下hibernate本地化方言配置方式

    springcloud下hibernate本地化方言配置方式

    這篇文章主要介紹了springcloud下hibernate本地化方言配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Java基礎(chǔ)之Object類詳解

    Java基礎(chǔ)之Object類詳解

    這篇文章主要介紹了Java基礎(chǔ)之Object類詳解,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-05-05

最新評(píng)論