简介
主要会通过安卓实战来讲解kotlin语法和实际应用,本教程设及知识点包括框架模式mvp+mvvm, Databinding(数据绑定框架),Dagger2(依赖注入框架),DeepLink(页面路由框架),Rxjava,RxAndroid(异步操作框架),Retrofit,Okhtttp等,不过本教程重点在kotlin所以这些框架需要了解可自行百度。
针对人群:Android中级以上,kotlin入门
接上一篇
MainActivity
完整代码,这个类主要完成了viewpager+fragment这种经典结构的绑定和底部导航栏点击事件处理
class MainActivity : BaseBindingActivity<ActivityMainBinding>(),RandomContract.View {
//语法点1: MutableList
lateinit var mFragments: MutableList<Fragment>
@Inject lateinit var mPresenter : RandomPresenter
override fun createDataBinding(savedInstanceState: Bundle?): ActivityMainBinding {
return DataBindingUtil.setContentView(this, R.layout.activity_main)
}
override fun initView() {
initFragments()
getMainComponent().plus(RandomModule(this)).inject(this)
viewPager.adapter = object : FragmentPagerAdapter(supportFragmentManager) {
override fun getItem(position: Int) = mFragments[position]
override fun getCount() = mFragments.size
}
viewPager.offscreenPageLimit = 4
navigationView.setOnNavigationItemSelectedListener { item ->
var tab = 0
when (item.itemId) {
R.id.menu_android -> tab = 0
R.id.menu_ios -> tab = 1
R.id.menu_girl -> tab = 2
R.id.menu_about -> tab = 3
}
viewPager.currentItem = tab
false
}
floatingButton.setOnClickListener {
mPresenter.getRandom("Android")
}
}
override fun onRandom(goods :FuckGoods) {
val url = URLEncoder.encode(goods.url)
toast("手气不错~")
GankRouter.router(this,GankClientUri.DETAIL + url)
}
private fun initFragments() {
mFragments = ArrayList()
mFragments.add(AndroidFragment.newInstance())
mFragments.add(IOSFragment.newInstance())
mFragments.add(GirlFragment.newInstance())
mFragments.add(FragmentHolder())
}
}
语法点1:MutableList
lateinit var mFragments: MutableList<Fragment>
MutableList<E>接口继承于List<E>,MutableCollection<E>,是对只读集合的扩展,增加了了对集合的添加及删除元素的操作。kotlin也有List但是它不同于java的List,kotlin的List只有只读属性,就是可以查询但不能增删改
语法点2:匿名对象
viewPager.adapter = object : FragmentPagerAdapter(supportFragmentManager) {
override fun getItem(position: Int) = mFragments[position]
override fun getCount() = mFragments.size
}
这里的object就是匿名对象和java的一样,注意一下kotlin的实现形式
语法点3:属性的使用
大家可能注意到了,viewPager.adapter
我们java里面都是要调用setAdapter的,这里其实用编辑器点击adapter你会发现,其实kotlin会自动调用这个方法 ,所以kotlin要使用一个属性,只需要使用名称引用即可
viewPager.offscreenPageLimit = 4
这样的属性使用的例子随处可见
语法点4:when函数
when (item.itemId) {
R.id.menu_android -> tab = 0
R.id.menu_ios -> tab = 1
R.id.menu_girl -> tab = 2
R.id.menu_about -> tab = 3
}
when是表达式,所以它能够返回存储到变量里的值,它更强大的应用可以看看下面的代码
val res = when {
x in 1..10 -> "cheap"
s.contains("hello") -> "it's a welcome!"
v is ViewGroup -> "child count: ${v.getChildCount()}"
else -> ""
}
when条件左边可以做任何很多事,因为它是表达式,比传统的switch强太多