上一篇 Kotlin入坑(一) 中搜集了一些现在网上的kotlin的学习资料,因为感觉kotlin跟java基本的编程思路都是一样的,只是语法上面的不同,于是将上面的资料大体看完就开始着手写个小项目练练手。
小项目地址 https://github.com/chsmy/DouBanKotlin
项目进行的过程中又一次印证了编程世界里,要想写好程序,一定得多敲多练。很多东西看一遍是看懂了,但是真的去写的时候,脑中还是一片空白。遇到问题也是一脸懵逼,还得去查文档。虽然做个简单的小项目也可以起到练习的目的。但是毕竟是小项目,只能涵盖部分的知识点。所以,下面的计划还得将其文档捋一遍,练习一遍。
这篇先记录一下小项目开发中的小知识点
(1)
使用kotlin开发android项目,首先你发现的一个简便的地方就是在也不用写findViewById了。只要我们在xml中给一个控件定义了一个id,就可以在activity或者fragment中直接使用那个id来操作了
比如xml中定义一个RelativeLayout搜索框
<RelativeLayout
android:id="@+id/relative_search"
android:layout_width="match_parent"
android:layout_height="36dp"
android:background="@drawable/search_background"
android:gravity="center_vertical"
android:layout_marginLeft="@dimen/dp_10"
android:layout_marginRight="@dimen/dp_10"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:drawablePadding="10dp"
android:drawableStart="@drawable/ic_search"
android:gravity="center"
android:text="@string/search_hint"/>
</RelativeLayout>
那么activity或者fragment中我们就可以直接这么写
relative_search.setOnClickListener{
val intent = Intent(context, SearchActivity::class.java)
context.startActivity(intent)
}
不用findViewById 直接使用id操作就可以,是不是简洁呢。
不过我们平时写xml的时候,经常会把一些能够复用的布局提出来,然后使用include标签来引入,这个时候如果你使用引入的布局中的id来操作发现无法使用。
其实当我们使用id直接操作的时候。IDE自动帮我们引入了一个包
“import kotlinx.android.synthetic.main.find_fragment.*”
语句中最后的find_fragment就是我们的fragment或者activity所对应的布局。如果我们想找到include标签引入的布局中的id也要把这个布局引入比如
“import kotlinx.android.synthetic.main.search_bar_text.*”
search_bar_text就是我们include引入的布局这样我们又可以愉快的使用id来操作了
(2)
我们平时开发一个andorid工程各种点击事件是经常要写的。比如setOnClickListener,以前我们使用的时候,
relative_search.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
到了kotlin中没有new关键词了,那匿名内部类怎么写呢kotlin中的匿名内部类使用object关键词。
relative_search.setOnClickListener(object : View.OnClickListener{
override fun onClick(v: View?) {
}
})
kotlin对Lambda表达式支持的很好。可以直接如下写
relative_search.setOnClickListener{
}
是不是很简单。
上面的监听方法中只有一个参数,如果是多个参数
mAdapter!!.setOnItemClickListener(object : BaseQuickAdapter.OnItemClickListener{
override fun onItemClick(adapter: BaseQuickAdapter<*, *>?, view: View?, position: Int) {
}
})
mAdapter!!.setOnItemClickListener { adapter, view, position ->
}
}
这样写我们的代码是不是很清晰啊。
上面这两点都是kotlin中的最基础的知识点,所以说在学习一个新的语言的时候,学会练熟它的基础很重要。就比如我们知道这个地方需要写一个匿名内部类,但是这个语言的匿名内部类 怎么写呢我知道,还得去查文档。当遇到另外的问题的时候,还不知道,还得去查文档。虽然差文档或者百度可以解决问题,但是这样做项目的时候断断续续无疑会很影响心情。
(3)
服务器返回的json数据转化成实体类无疑是个很费时并且没啥技术的苦力活,以前都是使用studio插件GsonFormat来自动生成。一开始我是先建一个java工程,然后使用GsonFormat生成实体类,在复制道kotlin的实体类对象中。使用IDE翻译。但是这样翻译过来的并不是最佳的,有很多的冗余。后来一想,kotlin中应该也有插件啊,然后一搜索果然有它就是JsonToKotlinClass,又可以愉快地开发了