Android应用开发之Android开发学习之路--Kotlin之Android开发使用心得和注意事项
凌雪 2018-10-24 来源 :网络 阅读 1265 评论 0

摘要:本文将带你了解Android应用开发之Android开发学习之路--Kotlin之Android开发使用心得和注意事项,希望本文对大家学Android有所帮助。

本文将带你了解Android应用开发之Android开发学习之路--Kotlin之Android开发使用心得和注意事项,希望本文对大家学Android有所帮助。


前言
1 @Autowired需要@JvmField注解
<!--?xml version="1.0"   encoding="utf-8"?--><linearlayout   android:layout_height="match_parent"   android:layout_width="match_parent"   android:orientation="vertical" xmlns:android="https://schemas.android.com/apk/res/android">     <textview   android:id="@+id/tv1"   android:layout_height="wrap_content"   android:layout_width="match_parent"><button   android:id="@+id/bt1"   android:layout_height="wrap_content"   android:layout_width="match_parent"></button></textview></linearlayout>
我们在Activity的onCreate中就可以直接这么写
tv1.text = "hello kotlin"   //textview填内容bt1.setOnClickListener   {  //监听button事件    toast("Hello   Kotlin")}
但是如果是Fragment中的话,需要注意一点就是:
不能在onCreateView方法里用view,不然会出现空指针异常,需要在onViewCreate里。因为kotlin的插件用了getView来findViewById,在onViewCreate后才获取到view.
3 with,apply
减少代码量,这个可以看下上一篇《   Android开发学习之路–Kotlin之常用表达式及函数》,这里不做过多介绍
4 fun内部也可以定义fun 利用局部函数抽取重复代码
可以在函数内部定义函数,来简化代码
比如一个findView的函数如下:
?12345fun initView()   {    private var mTv1:TextView =   itemView.findViewById(R.id.tv_1) as TextView    private   var mTv2:TextView = itemView.findViewById(R.id.tv_2) as   TextView    private var mTv3:TextView =   itemView.findViewById(R.id.tv_3) as TextView}
我们可以写一个内部函数,然后可以简化如下:
?1234567fun initView()   {    private fun findTextView(id: Int) =   itemView.findViewById(id) as TextView     private   var mTv1 = findTextView(R.id.tv_1)    private var mTv2 =   findTextView(R.id.tv_2)    private var mTv3 =   findTextView(R.id.tv_3)}
5 匿名内部类
kotlin中没有java的new关键字,所以在调用类似于监听的方法中的匿名内部类时候,需要用到object,如下所示
addOnTabSelectedListener(object   : TabLayout.OnTabSelectedListener {    override fun   onTabReselected(tab: TabLayout.Tab?)   {    }     override fun   onTabUnselected(tab: TabLayout.Tab?)   {     }     override fun   onTabSelected(tab: TabLayout.Tab?) {     }})
6 代码注入 kapt
编译器的依赖关系需要使用kapt
kapt   "com.google.dagger:dagger-compiler:$DAGGER_COMPILER_VERSION"
7 static方法
在kotlin中使用类似java的静态方法,使用companion object
class Utils   {    companion object   {        fun test()   {            toast("Hello   kotlin")        }    }}
上述可以使用Utils.test()来调用
8 单表达式函数
a+b,或者比大小的函数,可以写的很简单:
fun sum(a:Int, b:Int) = a+b
9 使用数据类来快速实现model类
一般java中我们声明一个model类,需要设置属性为private,然后实现set/get方法,而kotlin中,我们只要简单地使用data就可以了。
//用data关键词来声明一个数据类,除了会自动实现get set,还会自动生成equals hashcode toStringdata class   person(    var name:String =   "",    var sex:String = "male")
若要实现Parcelable,需要在Builder.gradle中加入plugin
apply plugin:   'kotlin-android-extensions' ...... androidExtensions   {    experimental = true}
具体注解如下:
@Parcelizedata class   person(    var name:String =   "",    var sex:String = "male"):   Parcelable
10 Lambda表达式简化OnClickListener
比如一个Click事件
TextView textView = new   TextView(context);textView.setOnClickListener(new View.OnClickListener()   {    @Override    public void   onClick(View v) {        //do   something    }});
lambda的方式
?12345textView.setOnClickListener({ v   ->    {        //do   something    }})
当lambda的参数没有使用时可以省略,省略的时候用it来替代
?123textView.setOnClickListener({       //do something})
函数如果没有其他参数可以省略,最后变成了
?123textView.setOnClickListener   {   //do something }
11 高阶函数+lambda简化代码
当我们监听TabLayout的select的时候,一般我们这么写:
?12345678910111213tabLayout.addOnTabSelectedListener(object   : TabLayout.OnTabSelectedListener {    override fun   onTabReselected(tab: TabLayout.Tab?)   {         //do   something    }     override fun   onTabUnselected(tab: TabLayout.Tab?)   {        //do   something    }     override fun   onTabSelected(tab: TabLayout.Tab?)   {        //do   something    }})
有时候我们只需要调用其中的一个方法,则显得代码臃肿。这个时候高阶函数和lambda就可以派上用场了。
首先我们实现一个类实现TabLayout.OnTabSelectedListener接口。然后定义三个函数,传入的参数分别是函数,然后当接口中的方法被回调后,再调用具体传入的函数的方法。
class   _OnTabSelectedListener : TabLayout.OnTabSelectedListener   {    private var _onTabReselected: ((tab: TabLayout.Tab?)   -> Unit)? = null    private var _onTabUnselected:   ((tab: TabLayout.Tab?) -> Unit)? = null    private var   _onTabSelected: ((tab: TabLayout.Tab?) -> Unit)? =   null     override fun onTabReselected(tab:   TabLayout.Tab?) {        _onTabReselected?.invoke(tab)    }     fun   onTabReselected(func: (tab: TabLayout.Tab?) -> Unit)   {        _onTabReselected =   func    }     override fun   onTabUnselected(tab: TabLayout.Tab?)   {        _onTabUnselected?.invoke(tab)    }     fun   onTabUnselected(func: (tab: TabLayout.Tab?) -> Unit)   {        _onTabUnselected =   func    }     override fun   onTabSelected(tab: TabLayout.Tab?)   {        _onTabSelected?.invoke(tab)    }     fun   onTabSelected(func: (tab: TabLayout.Tab?) -> Unit)   {        _onTabSelected =   func    }}
然后我们写一个TabLayout的扩展函数,入参是一个函数,是我们上面写好的这个类的函数,返回一个Unit
fun   TabLayout.addOnTabSelectedListener(func: _OnTabSelectedListener.() ->   Unit) {    val listener =   _OnTabSelectedListener()    listener.func()    addOnTabSelectedListener(listener)}
最后我们可以把代码写成这样:
addOnTabSelectedListener   {    onTabUnselected   {        //do   something    }     onTabSelected   {        //do   something    }     onTabReselected   {         //do   something    }}
当然,可以省略onTabUnselected, onTabSelected,onTabReselected的任何一个或者全部。
12 委托模式(by 关键字)
先定义两个接口Base1和Base2
interface Base1 {    fun   print1()}
interface Base2 {    fun   print2()}
两个实现类分别实现Base1和Base2
class BaseImpl(val x: Int) : Base1   {    override fun print1()   {        Log.d("BaseImpl",   "print1 -> $x")    }}
class BaseImpl2(val x: Int) : Base2   {    override fun print2()   {        Log.d("BaseImpl",   "print2 -> $x")    }}
接着用代理
class   PrintTest(        b1:   Base1,        b2: Base2) : Base1 by   b1, Base2 by b2
具体实现
val print1 = BaseImpl(10)val print2 =   BaseImpl2(5)PrintTest(print1, print2).print1()PrintTest(print1,   print2).print2() // 输出D/BaseImpl: print1 -> 10D/BaseImpl: print2 -> 5
PrinterTest没有实现接口Base1的方法print1(),而是通过关键字by,将实现委托给了b1。    

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之Android频道!

本文由 @凌雪 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved