您现在的位置是:首页 > 文章详情

4.kotlin安卓实践课程-用kotlin写第一个activity(构建mvvm和mvp基本页面)

日期:2018-05-29点击:302

简介

主要会通过安卓实战来讲解kotlin语法和实际应用,本教程设及知识点包括框架模式mvp+mvvm, Databinding(数据绑定框架),Dagger2(依赖注入框架),DeepLink(页面路由框架),Rxjava,RxAndroid(异步操作框架),Retrofit,Okhtttp等,不过本教程重点在kotlin所以这些框架需要了解可自行百度。

针对人群:Android中级以上,kotlin入门


现在开始写我们的第一个页面代码

1.第一步创建我们的activity类

class MainActivity : BaseBindingActivity<ActivityMainBinding>() { override fun createDataBinding(savedInstanceState: Bundle?): ActivityMainBinding { return DataBindingUtil.setContentView(this, R.layout.activity_main) } override fun initView() { } } 

2.这里说明一下这里我们还定义了一个基类BaseBindingActivity,先看看它的代码

 /** * Created by bigman on 18-05-18. */ abstract class BaseBindingActivity<B : ViewDataBinding> : AppCompatActivity() { lateinit var mBinding: B override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) //完成databinding页面绑定 mBinding = createDataBinding(savedInstanceState) initView() } abstract fun initView() abstract fun createDataBinding(savedInstanceState: Bundle?): B //设置toolbar fun setupToolbar(toolbar: Toolbar){ toolbar.title = "" toolbar.setNavigationIcon(R.drawable.icon_back) setSupportActionBar(toolbar) } //目录菜单点击事件 override fun onOptionsItemSelected(item: MenuItem): Boolean { when (item.itemId) { android.R.id.home -> onBackPressed() } return super.onOptionsItemSelected(item) } } 

这个基类其实就是提供了两个抽象方法,使得每个页面必须提供一个ViewDataBinding类型实现databinding的绑定和视图初始化,这个类型其实在定义了符合databinding标准的layout文件xml就能自动生成,比如我们这里的ActivityMainBinding

class MainActivity : BaseBindingActivity<ActivityMainBinding>() 

3.然后我们看看什么格式的xml可以生成这个ViewDataBinding的类

<?xml version="1.0" encoding="utf-8"?> <layout xmlns:app="http://schemas.android.com/apk/res-auto"> <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.bigman.kotlin.ui.activity.MainActivity"> <com.bigman.kotlin.ui.widget.NoScrollViewPager android:id="@+id/viewPager" android:layout_width="match_parent" android:layout_height="match_parent"> </com.bigman.kotlin.ui.widget.NoScrollViewPager> <android.support.design.widget.BottomNavigationView app:layout_behavior="@string/bye_burger_bottom_behavior" android:id="@+id/navigationView" android:layout_gravity="bottom" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/colorPrimary" app:itemIconTint="#fff" app:itemTextColor="#fff" app:menu="@menu/bottom" > </android.support.design.widget.BottomNavigationView> <android.support.design.widget.FloatingActionButton android:src="@drawable/random" android:id="@+id/floatingButton" app:layout_behavior="@string/bye_burger_float_behavior" android:layout_gravity="bottom|right" app:backgroundTint="@color/colorPrimary" android:layout_marginBottom="70dp" android:layout_marginRight="10dp" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </android.support.design.widget.CoordinatorLayout> </layout> 

用过Databinding的同学很熟悉这个xml,但是没接触过的同学一定很好奇这个父布局标签layout,不懂的同学可以去学习一下Databinding

  1. 我们加入MVP,直接看看代码
class MainActivity : BaseBindingActivity<ActivityMainBinding>() ,RandomContract.View { //MVP的P层 @Inject lateinit var mPresenter : RandomPresenter override fun createDataBinding(savedInstanceState: Bundle?): ActivityMainBinding { return DataBindingUtil.setContentView(this, R.layout.activity_main) } override fun initView() { //依赖注入 getMainComponent().plus(RandomModule(this)).inject(this) } } } 

这里先简单讲一下加入的mvp架构,首先是我们的MainActivity实现了RandomContract.View接口,然后用注解@Inject注入了RandomPresenter,最后在initView方法内部注入依赖

 getMainComponent().plus(RandomModule(this)).inject(this) 

getMainComponent()这个函数被我定义到一个kt文件里面

/** * create by bigman * description:扩展函数 * 参考url:https://blog.csdn.net/comwill/article/details/77206508 * 三个特点: * 1.Kotlin的扩展函数功能使得我们可以为现有的类添加新的函数,实现某一具体功能 。 * 2.扩展函数是静态解析的,并未对原类添加函数或属性,对类本身没有任何影响。 * 3.扩展属性允许定义在类或者kotlin文件中,不允许定义在函数中。 */ fun Context.getMainComponent() = App.instance.apiComponent fun Context.toast(msg:String,length:Int = Toast.LENGTH_SHORT){ Toast.makeText(this, msg, length).show() } fun Any.toString():String{ if(this == null) return "null" else{ return toString() } } // 使用扩展函数 fun View.dp_f(dp: Float): Float { // 引用View的context return TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP, dp, context.resources.displayMetrics) } // 转换Int fun View.dp_i(dp: Float): Int { return dp_f(dp).toInt() } 

这里的知识点就是扩展函数 ,我在代码里写了什么是扩展函数,扩展函数可以方便我们书写包装方法,大家可以仔细看看我们的编写和使用方法


欢迎一起交流,有问题加群交流

kotlin实战交流群群二维码.png
原文链接:https://yq.aliyun.com/articles/632620
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章