日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
一覺醒來Kotlin成了Android的新寵兒【附代碼】

前言

凌晨的谷歌I/O 2017開發(fā)者大會直播你有沒有觀看呢?安卓雖然已經(jīng)成為了移動設備***操作系統(tǒng),全球采用Android操作系統(tǒng)的激活設備超過了20億臺。不過對于谷歌來說,需要依靠java來做安卓開發(fā)一直是一個心病,因為oracle公司因為java和谷歌在安卓系統(tǒng)上的訴訟搞得心力憔悴。

現(xiàn)在好了,谷歌官方正式支持Kotlin,成為官方認可的安卓開發(fā)***語言,而且從Android Studio 3.0開始,將直接集成Kotlin而無需安裝任何的插件。

正文

開始做安卓UI開發(fā)一直是使用XML文件來實現(xiàn)。雖然理論上,UI可以使用Java語言來實現(xiàn),但并沒有太多的用處。不久前,JetBrains推出了Kotlin,一種面向JVM的現(xiàn)代語言,可以很好的實現(xiàn)安卓UI。

Jetbrains宣稱Anko是Android中更快,更輕松的開發(fā)風格。Kotlin提供Anko庫來作為DSL(領域?qū)S谜Z言)去設計安卓界面,一個簡單的例子:

下面的界面由一個圖片和一個按鈕組成:

使用Anko實現(xiàn)如下:

 
 
 
 
  1. verticalLayout{
  2.        imageView(R.drawable.anko_logo).
  3.                 lparams(width= matchParent) {
  4.                     padding = dip(20)
  5.                     margin = dip(15)
  6.         }
  7.         button("Tap to Like") {
  8.                 onClick { toast("Thanks for the love!") }
  9.         }
  10.     } 

我們定義了一個垂直的線性布局作為容器包含圖片和按鈕,使用lparams定義了布局的位置信息,由Kotlin的內(nèi)聯(lián)函數(shù)也實現(xiàn)了按鈕的點擊事件。

使用Anko的優(yōu)點:

  • 我們可以將UI布局嵌入到代碼中,從而使其類型安全。
  • 由于我們不用XML編寫,所以它增加了效率,因為在分析XML浪費CPU時間。
  • 在UI的程序化轉(zhuǎn)換之后,我們可以將Anko DSL片段放入一個函數(shù)中。這樣便于代碼重用。
  • 顯然,代碼更簡潔,可讀和可掌握性更高。

現(xiàn)在我們使用Anko Layout和Kotlin構(gòu)建一個to-do app,來列出我們今天需要做的事。

你可以在GitHub上找到這個項目 to-do app

將Anko庫添加到Android Studio:

在streamline-android-java-code-with-kotlin去學習如何添加Kotlin到你的安卓項目中,有了Kotlin,我們需要添加Anko依賴在app/build.gradle中,這樣我們就可以順利編譯項目了。

 
 
 
 
  1. compile [size=1em]'org.jetbrains.anko:anko-sdk15:0.8.3'
  2. // sdk19,21,23 也可以使用

可以根據(jù)你項目的minSdkVersion來添加這個依賴,上面的例子說明15<=minSdkVersion<19,你可以在Anko的GitHub庫中找到自己需要的其他Anko依賴庫。

我們準備使用下面的依賴庫:

 
 
 
 
  1. compile 'org.jetbrains.anko:anko-design:0.8.3'
  2. compile 'org.jetbrains.anko:anko-appcompat-v7:0.8.3'

在Activity中調(diào)用Anko布局:

我們不再使用XML來寫布局文件,所以我們不需要XML View,所以也不需要findViewById()方法了。這里我們假設我們的Anko布局類為MainUI,然后我們可以開始寫我們的activit內(nèi)容:

 
 
 
 
  1. var ui =MainUI()           //MainUI類代替了XML布局
  2. ui.setContentView(this)   //this代表Activity類

現(xiàn)在我們創(chuàng)建一個Kotlin文件MainActivity.kt,寫上如下代碼:

 
 
 
 
  1. class MainActivity : AppCompatActivity() {    val task_list = ArrayList()         //任務清單表
  2.     override fun onCreate(savedInstanceState: Bundle?) {
  3.        super.onCreate(savedInstanceState)
  4.        savedInstanceState?.let {           val arrayList = savedInstanceState.get("ToDoList")
  5.            task_list.addAll(arrayList as List)
  6.        }       var adapter=TodoAdapter(task_list)      //定義適配器
  7.        var ui = MainUI(adapter)                //定義將要使用的Anko UI 布局
  8.        ui.setContentView(this)                 //給Activity設置Anko布局
  9.    }   override fun onSaveInstanceState(outState: Bundle?) {
  10.        outState?.putStringArrayList("ToDoList", task_list)
  11.        super.onSaveInstanceState(outState)
  12.      }
  13.  } 

task_list是ArrayList,將填充ListView的TodoAdapter。MainUI(adapter)是我們的Anko UI文件,它采用TodoAdapter類作為適配器參數(shù)。所以,接下來我們再創(chuàng)建一個TodoAdapter類。

用于ListView的TodoAdapter適配器

TodoAdapter類有一個ArrayList類型的list,并且繼承了BaseAdapter。所以我們需要重寫一下四個方法:

public int getCount()public Object getItem(int i)public long getItemId(int i)public View getView(int i, View view, ViewGroup viewGroup)

在getView()方法中我們需要使用Anko設計一個表元素的布局。

 
 
 
 
  1. public int getCount()public Object getItem(int i)public long getItemId(int i)public View getView(int i, View view, ViewGroup viewGroup)
  2.         在getView()方法中我們需要使用Anko設計一個表元素的布局。
  3. override fun getView(i : Int, v : View?, parent : ViewGroup?) : View {
  4.               return with(parent!!.context) {              //任務數(shù)從1開始
  5.               var taskNum: Int = i +1
  6.              //清單表元素布局
  7.              linearLayout {
  8.                    lparams(width = matchParent, height = wrapContent)
  9.                    padding = dip(10)
  10.                    orientation = HORIZONTAL                   //任務號
  11.                   textView {
  12.                        id = R.id.taskNum
  13.                        text=""+taskNum
  14.                        textSize = 16f
  15.                        typeface = Typeface.MONOSPACE
  16.                        padding =dip(5)
  17.                   }                  //任務名
  18.                   textView {
  19.                         id = R.id.taskName
  20.                        text=list.get(i)
  21.                        textSize = 16f
  22.                        typeface = DEFAULT_BOLD
  23.                        padding =dip(5)
  24.                   }
  25.              }
  26.          }
  27.       }
  • 在這個方法中,我們返回一個包含一個horizontalListView布局列表項的視圖。這是使用Kotlin的with語法完成的,它允許我們一次在對象實例上調(diào)用很多方法。
  • 每個列表項包含兩個textview用于顯示任務號和任務名稱。
  • linearLayout,textView是擴展功能。擴展功能使我們有能力啟用具有新功能的任何類。
  • text,textSize,typeface在android.widget.TextView有getter和setter方法,padding是Anko添加的屬性。

繼續(xù)下一步,我們需要定義列表的操作功能。因此,我們需要在TodoAdapter中定義add(String)和delete(Int)方法。add(String)將任務名稱作為參數(shù)添加到任務中。delete(Int)將任務所在的位置作為參數(shù)來刪除任務。下面是具體的實現(xiàn):

 
 
 
 
  1. //將任務添加到任務清單的方法     
  2.  fun add(text: String) {         
  3.        list.add(list.size, text)         
  4.        notifyDataSetChanged()          //更新數(shù)據(jù)    }       //將任務從任務清單中移除的方法     
  5.  fun delete(i:Int) {        
  6.        list.removeAt(i)         
  7.        notifyDataSetChanged()          //更新數(shù)據(jù)     
  8.  } 

所以,現(xiàn)在我們設計了列表,我們也可以添加和刪除項目到我們的列表中。接下來完成此適配器類的代碼。

  1.  TodoAdapter(val list: ArrayList = ArrayList()) : BaseAdapter() {    
  2.                override fun getView(i : Int, v : View?, parent : ViewGroup?) : View {        
  3.                          return with(parent!!.context) {            
  4.                                    //taskNum will serve as the S.No. of the list starting from 1            
  5.                                    var taskNum: Int = i +1           
  6.                                    //Layout for a list view item            
  7.                                    linearLayout {                
  8.                                           id = R.id.listItemContainer                
  9.                                           lparams(width = matchParent, height = wrapContent)                
  10.                                           padding = dip(10)                
  11.                                           orientation = HORIZONTAL                
  12.                                              textView {                    
  13.                                                    id = R.id.taskNum                   
  14.                                                    text=""+taskNum                   
  15.                                                    textSize = 16f                  
  16.                                                    typeface = Typeface.MONOSPACE                
  17.                                                    padding =dip(5)               
  18.                                              }                
  19.                                           textView {                   
  20.                                                   id = R.id.taskName                   
  21.                                                   text=list.get(i)                   
  22.                                                   textSize = 16f                    
  23.                                                   typeface = DEFAULT_BOLD                   
  24.                                                   padding =dip(5)                

    分享文章:一覺醒來Kotlin成了Android的新寵兒【附代碼】
    轉(zhuǎn)載注明:http://m.5511xx.com/article/ccdiije.html