成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一覺醒來Kotlin成了Android的新寵兒【附代碼】

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

前言

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

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

正文

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

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

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

 

使用Anko實現如下:

  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的內聯函數也實現了按鈕的點擊事件。

使用Anko的優點:

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

現在我們使用Anko Layout和Kotlin構建一個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.  
  3. // sdk19,21,23 也可以使用 

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

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

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

在Activity中調用Anko布局:

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

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

現在我們創建一個Kotlin文件MainActivity.kt,寫上如下代碼:

  1. class MainActivity : AppCompatActivity() {    val task_list = ArrayList<String>()         //任務清單表 
  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<String>) 
  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類作為適配器參數。所以,接下來我們再創建一個TodoAdapter類。

用于ListView的TodoAdapter適配器

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

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

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

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

  1.  TodoAdapter(val list: ArrayList<String> = ArrayList<String>()) : BaseAdapter() {     
  2.                override fun getView(i : Int, v : View?, parent : ViewGroup?) : View {         
  3.                          return with(parent!!.context) {             
  4.                                    //taskNum will serve as the S.Noof 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)                
  25.                                            }            
  26.                                     }         
  27.                                 }    
  28.                            }    
  29.            override fun getItem(position : Int) : String {         
  30.                       return list[position     
  31.             }     
  32.            override fun getCount() : Int {        
  33.                       return list.size    
  34.             }     
  35.            override fun getItemId(position : Int) : Long {         
  36.                      //can be used to return the item's ID column of table         
  37.                      eturn 0L     
  38.             }     
  39.            //function to add an item to the list     
  40.            fun add(text: String) {              
  41.                    list.add(list.size, text)         
  42.                    notifyDataSetChanged()    
  43.            }     
  44.           //function to delete an item from list    
  45.           fun delete(i:Int) {         
  46.                    list.removeAt(i)         
  47.                    notifyDataSetChanged()    
  48.           } 
  49.  

注意,使用Anko DSL類中必須要導入org.jetbrains.anko.*。

設計項目的外觀

Anko為我們提供了在單獨的Kotlin類中為Activity使用UI的便利。因此,每個屏幕都可以被認為是Kotlin類的UI-Activity匹配對。這個UI類是通過繼承在org.jetbrains.anko包中定義的AnkoComponent<T>接口的功能來實現的。

除了這個接口,JetBrains還提供免費的DSL布局預覽功能。下面是Anko DSL布局預覽在Android Studio中的樣子:

 

Anko Preview的相應插件可以從這里下載。請注意,在撰寫本文時,Android Studio 2.2的Anko DSL 布局預覽被列為開源issue。

回到正題,我們接下來設計MainUI類展示所有任務列表。MainUI類繼承了AnkoComponent<T>接口,其中T指的是UI的所有者,activity的內容將會是這個UI。在我們的例子中,所有者就是我們已經在上面定義的MainActivity。接下來,在初始化時,我們必須將TodAadapter對象傳遞給此類,因為此適配器將用于填充列表。所以,MainUI聲明變成:

  1. class MainUI(val todoAdapter : TodoAdapter) : AnkoComponent<MainActivity> 

現在我們需要重寫方法 createView() ,使用 AnkoContext 對象作為參數并返回一個View 類型:

  1. override fun createView(ui: AnkoContext<MainActivity>): View = with(ui) { 
  2.  
  3. } 

我們在createView() 方法中UI定義返回給所有者即activity,在這里也就是MainActivity,所以接下來寫createView() 方法:

Step1-設計首頁

 

最初,首頁是空列表。所以,我們有一個textView要求用戶創建一天的Todo List:

  1. return relativeLayout {         
  2.                          //聲明ListView         
  3.                         var todoList : ListView? =null        
  4.                         //當沒有任務時顯示textView內容"What's your Todo List for today?"         
  5.                         val hintListView = textView("What's your Todo List for today?") {             
  6.                                             textSize = 20f       
  7.                           }.lparams {             
  8.                     centerInParent()         
  9.                    } 
  10.        }  

centerInParent() 是將視圖的布局定義為垂直和水平相對中心的輔助方法。因為它是一個todo性質的應用,其本質在于顯示任務的列表。所以,我們在這里定義listView:

  1. //listView   
  2.   verticalLayout {                 
  3.                todoList=listView {                 
  4.               //assign adapter                 
  5.              adapter = todoAdapter               
  6.               }            
  7.       }.lparams {                 
  8.           margin = dip(5)            

todoAdapter是我們在MainUI類聲明中定義成員變量。我們用todoAdapter的值初始化listView的adapter,這是一個TodoAdpater類的對象,將會用于填充列表。

為了幫助用戶添加任務,我們在主屏幕的右下方提供了一個Material design風格的floatingActionButton。所以我們使用Anko編程floatingActionButton為:

  1. floatingActionButton {                           
  2.          imageResource = android.R.drawable.ic_input_add         
  3.           }.lparams {             
  4.                           //設置按鈕在屏幕的右下方             
  5.                            margin = dip(10)             
  6.                            alignParentBottom()             
  7.                            alignParentEnd()             
  8.                            alignParentRight()             
  9.                            gravity = Gravity.BOTTOM or Gravity.END        
  10.     }  

篇幅所限,Step2、Step3請點擊左下角“閱讀原文”查看全部文章。

***的想法

我們在開發此to-do app時沒有使用任何XML布局資源,但我們能夠以類似的風格設計應用程序。Anko從應用程序的activity或fragments中消除了呈現數據的負擔,響應用戶交互,連接數據庫等這些負擔。另外,隔離UI和Activity類使得應用程序更接近MVP(Model-View-Presenter)架構。你可以從這里了解Anko的高級功能。

雖然它有一些缺點,如較慢的編譯和應用程序體積大,因為它在復用,維護和測試代碼方面打包了很多東西。

***次翻譯這么長的文章,純手打,如果有什么錯誤的地方還請指出包涵!也是因為自己對Kotlin的興趣所以找了這篇文章來翻譯,有興趣的朋友可以看看學習一下。 

責任編輯:龐桂玉 來源: 安卓巴士Android開發者門戶
相關推薦

2015-05-20 13:12:53

ALTIBASE內存數據庫

2024-10-09 08:48:52

2013-10-08 10:13:41

SDNOpenDayligh

2009-02-19 16:49:49

Windows 7優點

2012-02-27 09:20:43

Julia編程語言

2015-10-28 14:25:24

云數據中心銳捷100T平臺

2015-11-16 11:24:44

流量提速降費運營商

2024-08-26 09:00:00

異構計算多元算力CPU

2018-06-08 16:04:49

AI助理運營商互聯網

2019-09-23 09:34:05

AI

2014-07-17 14:22:38

Docker云計算

2011-08-03 14:03:08

OM4光纖光纖OM4

2012-05-15 17:26:40

HP DL380 G7

2024-06-26 13:35:54

2021-11-23 15:35:01

程序員Rust開發者

2024-04-28 08:53:54

邊緣AI

2017-05-19 16:40:41

AndroidKotlin開發者

2020-04-23 14:51:05

寧暢

2011-01-24 13:32:16

10GBe10G以太網數據中心

2020-02-09 16:52:02

睡醒公司倒閉
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久精品亚洲一区 | 自拍偷拍亚洲视频 | 成人依人| 国产我和子的乱视频网站 | 日韩精品一区二区三区在线播放 | 欧美成人久久 | 国产69精品久久久久777 | 国内精品伊人久久久久网站 | 亚洲成人第一页 | 精品美女视频在免费观看 | 一本大道久久a久久精二百 国产成人免费在线 | 欧美成年人视频在线观看 | 在线看片福利 | 中文字幕在线一区二区三区 | 日韩中文在线视频 | 久久综合一区二区 | 91精品国产麻豆 | 久久神马 | 做a视频| 国产在线中文字幕 | 国产高清一区二区 | 中文字幕视频在线 | 九色91视频| 久久精品一二三影院 | 精品国产欧美一区二区三区成人 | 欧美精选一区二区 | 成人av一区二区三区 | 伊人激情网 | 成人在线观看亚洲 | 99精品国产一区二区青青牛奶 | 99久久免费精品国产免费高清 | 欧美h视频 | 欧美精品久久久 | 99热国产免费 | 国产一级片精品 | 国产一区不卡在线观看 | 天天干天天玩天天操 | 日韩精品免费播放 | 天堂在线www | 精品一区二区在线看 | 久免费视频 |