一觉醒来Kotlin成了Android的新宠儿【附代码】

前言

凌晨的谷歌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. // sdk19,21,23 也可以使用

可以根据你项目的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中调用Anko布局:

我们不再使用XML来写布局文件,所以我们不需要XML View,所以也不需要findViewById()方法了。这里我们假设我们的Anko布局类为MainUI,然后我们可以开始写我们的activit内容:

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

现在我们创建一个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类作为适配器参数。所以,接下来我们再创建一个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) {              //任务数从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语法完成的,它允许我们一次在对象实例上调用很多方法。
  • 每个列表项包含两个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 = 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的新宠儿【附代码】
    当前网址:http://www.shufengxianlan.com/qtweb/news41/344291.html

    网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

    广告

    声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联