Kotlin中Anko库怎么用(anko,kotlin,移动开发)

时间:2024-05-05 17:38:33 作者 : 石家庄SEO 分类 : 移动开发
  • TAG :

正文

开始做安卓UI开发一直是使用XML文件来实现。虽然理论上,UI可以使用Java语言来实现,但并没有太多的用处。不久前,JetBrains推出了Kotlin,一种面向JVM的现代语言,可以很好的实现安卓UI。

Jetbrains宣称Anko是Android中更快,更轻松的开发风格。Kotlin提供Anko库来作为DSL(领域专用语言)去设计安卓界面,一个简单的例子:

下面的界面由一个图片和一个按钮组成:

Kotlin中Anko库怎么用

使用Anko实现如下:

verticalLayout{imageView(R.drawable.anko_logo).lparams(width=matchParent){padding=dip(20)margin=dip(15)}button("TaptoLike"){onClick{toast("Thanksforthelove!")}}}

我们定义了一个垂直的线性布局作为容器包含图片和按钮,使用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中,这样我们就可以顺利编译项目了。

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

可以根据你项目的minSdkVersion来添加这个依赖,上面的例子说明15<=minSdkVersion<19,你可以在Anko的GitHub库中找到自己需要的其他Anko依赖库。

我们准备使用下面的依赖库:

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

在Activity中调用Anko布局:

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

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

现在我们创建一个Kotlin文件MainActivity.kt,写上如下代码:

classMainActivity:AppCompatActivity(){valtask_list=ArrayList<String>()//任务清单表overridefunonCreate(savedInstanceState:Bundle?){super.onCreate(savedInstanceState)savedInstanceState?.let{valarrayList=savedInstanceState.get("ToDoList")task_list.addAll(arrayListasList<String>)}varadapter=TodoAdapter(task_list)//定义适配器varui=MainUI(adapter)//定义将要使用的AnkoUI布局ui.setContentView(this)//给Activity设置Anko布局}overridefunonSaveInstanceState(outState:Bundle?){outState?.putStringArrayList("ToDoList",task_list)super.onSaveInstanceState(outState)}}

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设计一个表元素的布局。

publicintgetCount()publicObjectgetItem(inti)publiclonggetItemId(inti)publicViewgetView(inti,Viewview,ViewGroupviewGroup)在getView()方法中我们需要使用Anko设计一个表元素的布局。overridefungetView(i:Int,v:View?,parent:ViewGroup?):View{returnwith(parent!!.context){//任务数从1开始vartaskNum:Int=i+1//清单表元素布局linearLayout{lparams(width=matchParent,height=wrapContent)padding=dip(10)orientation=HORIZONTAL//任务号textView{id=R.id.taskNumtext=""+taskNumtextSize=16ftypeface=Typeface.MONOSPACEpadding=dip(5)}//任务名textView{id=R.id.taskNametext=list.get(i)textSize=16ftypeface=DEFAULT_BOLDpadding=dip(5)}}}}
  • 在这个方法中,我们返回一个包含一个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)将任务所在的位置作为参数来删除任务。下面是具体的实现:

//将任务添加到任务清单的方法funadd(text:String){list.add(list.size,text)notifyDataSetChanged()//更新数据}//将任务从任务清单中移除的方法fundelete(i:Int){list.removeAt(i)notifyDataSetChanged()//更新数据}

所以,现在我们设计了列表,我们也可以添加和删除项目到我们的列表中。接下来完成此适配器类的代码。

TodoAdapter(vallist:ArrayList<String>=ArrayList<String>()):BaseAdapter(){overridefungetView(i:Int,v:View?,parent:ViewGroup?):View{returnwith(parent!!.context){//taskNumwillserveastheS.No.oftheliststartingfrom1vartaskNum:Int=i+1//LayoutforalistviewitemlinearLayout{id=R.id.listItemContainerlparams(width=matchParent,height=wrapContent)padding=dip(10)orientation=HORIZONTALtextView{id=R.id.taskNumtext=""+taskNumtextSize=16ftypeface=Typeface.MONOSPACEpadding=dip(5)}textView{id=R.id.taskNametext=list.get(i)textSize=16ftypeface=DEFAULT_BOLDpadding=dip(5)}}}}overridefungetItem(position:Int):String{returnlist[position}overridefungetCount():Int{returnlist.size}overridefungetItemId(position:Int):Long{//canbeusedtoreturntheitem'sIDcolumnoftableeturn0L}//functiontoaddanitemtothelistfunadd(text:String){list.add(list.size,text)notifyDataSetChanged()}//functiontodeleteanitemfromlistfundelete(i:Int){list.removeAt(i)notifyDataSetChanged()}}

注意,使用Anko DSL类中必须要导入org.jetbrains.anko.*。

设计项目的外观

Anko为我们提供了在单独的Kotlin类中为Activity使用UI的便利。因此,每个屏幕都可以被认为是Kotlin类的UI-Activity匹配对。这个UI类是通过继承在org.jetbrains.anko包中定义的AnkoComponent<T>接口的功能来实现的。

除了这个接口,JetBrains还提供免费的DSL布局预览功能。下面是Anko DSL布局预览在Android Studio中的样子:

Kotlin中Anko库怎么用

Anko Preview的相应插件可以从这里下载。请注意,在撰写本文时,Android Studio 2.2的Anko DSL 布局预览被列为开源issue。

回到正题,我们接下来设计MainUI类展示所有任务列表。MainUI类继承了AnkoComponent<T>接口,其中T指的是UI的所有者,activity的内容将会是这个UI。在我们的例子中,所有者就是我们已经在上面定义的MainActivity。接下来,在初始化时,我们必须将TodAadapter对象传递给此类,因为此适配器将用于填充列表。所以,MainUI声明变成:

classMainUI(valtodoAdapter:TodoAdapter):AnkoComponent<MainActivity>

现在我们需要重写方法 createView() ,使用 AnkoContext 对象作为参数并返回一个View 类型:

overridefuncreateView(ui:AnkoContext<MainActivity>):View=with(ui){}

我们在createView() 方法中UI定义返回给所有者即activity,在这里也就是MainActivity,所以接下来写createView() 方法:

Step1-设计首页

Kotlin中Anko库怎么用

最初,首页是空列表。所以,我们有一个textView要求用户创建一天的Todo List:

returnrelativeLayout{//声明ListViewvartodoList:ListView?=null//当没有任务时显示textView内容"What'syourTodoListfortoday?"valhintListView=textView("What'syourTodoListfortoday?"){textSize=20f}.lparams{centerInParent()}}

centerInParent() 是将视图的布局定义为垂直和水平相对中心的辅助方法。因为它是一个todo性质的应用,其本质在于显示任务的列表。所以,我们在这里定义listView:

//listViewverticalLayout{todoList=listView{//assignadapteradapter=todoAdapter}}.lparams{margin=dip(5)}

todoAdapter是我们在MainUI类声明中定义成员变量。我们用todoAdapter的值初始化listView的adapter,这是一个TodoAdpater类的对象,将会用于填充列表。

为了帮助用户添加任务,我们在主屏幕的右下方提供了一个Material design风格的floatingActionButton。所以我们使用Anko编程floatingActionButton为:

floatingActionButton{imageResource=android.R.drawable.ic_input_add}.lparams{//设置按钮在屏幕的右下方margin=dip(10)alignParentBottom()alignParentEnd()alignParentRight()gravity=Gravity.BOTTOMorGravity.END}
 </div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
本文:Kotlin中Anko库怎么用的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:测试VS2010代码的示例分析下一篇:

4 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18