新聞中心
前言

凌晨的谷歌I/O 2017開發(fā)者大會(huì)直播你有沒有觀看呢?安卓雖然已經(jīng)成為了移動(dòng)設(shè)備***操作系統(tǒng),全球采用Android操作系統(tǒng)的激活設(shè)備超過了20億臺(tái)。不過對(duì)于谷歌來說,需要依靠java來做安卓開發(fā)一直是一個(gè)心病,因?yàn)閛racle公司因?yàn)閖ava和谷歌在安卓系統(tǒng)上的訴訟搞得心力憔悴。
現(xiàn)在好了,谷歌官方正式支持Kotlin,成為官方認(rèn)可的安卓開發(fā)***語言,而且從Android Studio 3.0開始,將直接集成Kotlin而無需安裝任何的插件。
正文
開始做安卓UI開發(fā)一直是使用XML文件來實(shí)現(xiàn)。雖然理論上,UI可以使用Java語言來實(shí)現(xiàn),但并沒有太多的用處。不久前,JetBrains推出了Kotlin,一種面向JVM的現(xiàn)代語言,可以很好的實(shí)現(xiàn)安卓UI。
Jetbrains宣稱Anko是Android中更快,更輕松的開發(fā)風(fēng)格。Kotlin提供Anko庫來作為DSL(領(lǐng)域?qū)S谜Z言)去設(shè)計(jì)安卓界面,一個(gè)簡單的例子:
下面的界面由一個(gè)圖片和一個(gè)按鈕組成:
使用Anko實(shí)現(xiàn)如下:
- verticalLayout{
- imageView(R.drawable.anko_logo).
- lparams(width= matchParent) {
- padding = dip(20)
- margin = dip(15)
- }
- button("Tap to Like") {
- onClick { toast("Thanks for the love!") }
- }
- }
我們定義了一個(gè)垂直的線性布局作為容器包含圖片和按鈕,使用lparams定義了布局的位置信息,由Kotlin的內(nèi)聯(lián)函數(shù)也實(shí)現(xiàn)了按鈕的點(diǎn)擊事件。
使用Anko的優(yōu)點(diǎn):
- 我們可以將UI布局嵌入到代碼中,從而使其類型安全。
- 由于我們不用XML編寫,所以它增加了效率,因?yàn)樵诜治鯴ML浪費(fèi)CPU時(shí)間。
- 在UI的程序化轉(zhuǎn)換之后,我們可以將Anko DSL片段放入一個(gè)函數(shù)中。這樣便于代碼重用。
- 顯然,代碼更簡潔,可讀和可掌握性更高。
現(xiàn)在我們使用Anko Layout和Kotlin構(gòu)建一個(gè)to-do app,來列出我們今天需要做的事。
你可以在GitHub上找到這個(gè)項(xiàng)目 to-do app
將Anko庫添加到Android Studio:
在streamline-android-java-code-with-kotlin去學(xué)習(xí)如何添加Kotlin到你的安卓項(xiàng)目中,有了Kotlin,我們需要添加Anko依賴在app/build.gradle中,這樣我們就可以順利編譯項(xiàng)目了。
- compile [size=1em]'org.jetbrains.anko:anko-sdk15:0.8.3'
- // sdk19,21,23 也可以使用
可以根據(jù)你項(xiàng)目的minSdkVersion來添加這個(gè)依賴,上面的例子說明15<=minSdkVersion<19,你可以在Anko的GitHub庫中找到自己需要的其他Anko依賴庫。
我們準(zhǔn)備使用下面的依賴庫:
- compile 'org.jetbrains.anko:anko-design:0.8.3'
- compile 'org.jetbrains.anko:anko-appcompat-v7:0.8.3'
在Activity中調(diào)用Anko布局:
我們不再使用XML來寫布局文件,所以我們不需要XML View,所以也不需要findViewById()方法了。這里我們假設(shè)我們的Anko布局類為MainUI,然后我們可以開始寫我們的activit內(nèi)容:
- var ui =MainUI() //MainUI類代替了XML布局
- ui.setContentView(this) //this代表Activity類
現(xiàn)在我們創(chuàng)建一個(gè)Kotlin文件MainActivity.kt,寫上如下代碼:
- class MainActivity : AppCompatActivity() { val task_list = ArrayList
() //任務(wù)清單表 - override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- savedInstanceState?.let { val arrayList = savedInstanceState.get("ToDoList")
- task_list.addAll(arrayList as List
) - } var adapter=TodoAdapter(task_list) //定義適配器
- var ui = MainUI(adapter) //定義將要使用的Anko UI 布局
- ui.setContentView(this) //給Activity設(shè)置Anko布局
- } override fun onSaveInstanceState(outState: Bundle?) {
- outState?.putStringArrayList("ToDoList", task_list)
- super.onSaveInstanceState(outState)
- }
- }
task_list是ArrayList,將填充ListView的TodoAdapter。MainUI(adapter)是我們的Anko UI文件,它采用TodoAdapter類作為適配器參數(shù)。所以,接下來我們?cè)賱?chuàng)建一個(gè)TodoAdapter類。
用于ListView的TodoAdapter適配器
TodoAdapter類有一個(gè)ArrayList
public int getCount()public Object getItem(int i)public long getItemId(int i)public View getView(int i, View view, ViewGroup viewGroup)
在getView()方法中我們需要使用Anko設(shè)計(jì)一個(gè)表元素的布局。
- public int getCount()public Object getItem(int i)public long getItemId(int i)public View getView(int i, View view, ViewGroup viewGroup)
- 在getView()方法中我們需要使用Anko設(shè)計(jì)一個(gè)表元素的布局。
- override fun getView(i : Int, v : View?, parent : ViewGroup?) : View {
- return with(parent!!.context) { //任務(wù)數(shù)從1開始
- var taskNum: Int = i +1
- //清單表元素布局
- linearLayout {
- lparams(width = matchParent, height = wrapContent)
- padding = dip(10)
- orientation = HORIZONTAL //任務(wù)號(hào)
- textView {
- id = R.id.taskNum
- text=""+taskNum
- textSize = 16f
- typeface = Typeface.MONOSPACE
- padding =dip(5)
- } //任務(wù)名
- textView {
- id = R.id.taskName
- text=list.get(i)
- textSize = 16f
- typeface = DEFAULT_BOLD
- padding =dip(5)
- }
- }
- }
- }
- 在這個(gè)方法中,我們返回一個(gè)包含一個(gè)horizontalListView布局列表項(xiàng)的視圖。這是使用Kotlin的with語法完成的,它允許我們一次在對(duì)象實(shí)例上調(diào)用很多方法。
- 每個(gè)列表項(xiàng)包含兩個(gè)textview用于顯示任務(wù)號(hào)和任務(wù)名稱。
- linearLayout,textView是擴(kuò)展功能。擴(kuò)展功能使我們有能力啟用具有新功能的任何類。
- text,textSize,typeface在android.widget.TextView有g(shù)etter和setter方法,padding是Anko添加的屬性。
繼續(xù)下一步,我們需要定義列表的操作功能。因此,我們需要在TodoAdapter中定義add(String)和delete(Int)方法。add(String)將任務(wù)名稱作為參數(shù)添加到任務(wù)中。delete(Int)將任務(wù)所在的位置作為參數(shù)來刪除任務(wù)。下面是具體的實(shí)現(xiàn):
- //將任務(wù)添加到任務(wù)清單的方法
- fun add(text: String) {
- list.add(list.size, text)
- notifyDataSetChanged() //更新數(shù)據(jù) } //將任務(wù)從任務(wù)清單中移除的方法
- fun delete(i:Int) {
- list.removeAt(i)
- notifyDataSetChanged() //更新數(shù)據(jù)
- }
所以,現(xiàn)在我們?cè)O(shè)計(jì)了列表,我們也可以添加和刪除項(xiàng)目到我們的列表中。接下來完成此適配器類的代碼。
- TodoAdapter(val list: ArrayList
= ArrayList ()) : BaseAdapter() { - override fun getView(i : Int, v : View?, parent : ViewGroup?) : View {
- return with(parent!!.context) {
- //taskNum will serve as the S.No. of the list starting from 1
- var taskNum: Int = i +1
- //Layout for a list view item
- linearLayout {
- id = R.id.listItemContainer
- lparams(width = matchParent, height = wrapContent)
- padding = dip(10)
- orientation = HORIZONTAL
- textView {
- id = R.id.taskNum
- text=""+taskNum
- textSize = 16f
- typeface = Typeface.MONOSPACE
- padding =dip(5)
- }
- textView {
- id = R.id.taskName
- text=list.get(i)
- textSize = 16f
- typeface = DEFAULT_BOLD
- padding =dip(5)
標(biāo)題名稱:一覺醒來Kotlin成了Android的新寵兒【附代碼】
鏈接地址:http://m.fisionsoft.com.cn/article/ccdiije.html


咨詢
建站咨詢
