4.kotlin安卓实践课程-用kotlin写第一个activity(构建mvvm和mvp基本页面)
简介
主要会通过安卓实战来讲解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
- 我们加入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()
}
这里的知识点就是扩展函数 ,我在代码里写了什么是扩展函数,扩展函数可以方便我们书写包装方法,大家可以仔细看看我们的编写和使用方法
欢迎一起交流,有问题加群交流

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
Android 自定义垂直,旋转,圆形进度提示 自定义Seekbar
SeekBar是用来调节参数值的,系统默认的一般都不太适合我们,需要我们自定义, 里面也有一个RxJava背压的具体应用 废话不多说,看图 package com.example.helang.seekbar; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.RectF; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.support.annotation.Nullable; import android.util.AttributeSet; im...
-
下一篇
6.kotlin安卓实践课程-用kotlin写第一个activity对应P层
简介 主要会通过安卓实战来讲解kotlin语法和实际应用,本教程设及知识点包括框架模式mvp+mvvm, Databinding(数据绑定框架),Dagger2(依赖注入框架),DeepLink(页面路由框架),Rxjava,RxAndroid(异步操作框架),Retrofit,Okhtttp等,不过本教程重点在kotlin所以这些框架需要了解可自行百度。 针对人群:Android中级以上,kotlin入门 上一篇文章讲了MainActivity的代码构成 MainActivity当中有一段代码 floatingButton.setOnClickListener { mPresenter.getRandom("Android") } 它就是通过P层去请求网络,具体的定义我们先看看RandomPresenter的构成 /** * Created by bigman on 18-05-18. */ class RandomPresenter @Inject constructor(private val mModel: RandomModel, private val mView: Ran...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Dcoker安装(在线仓库),最新的服务器搭配容器使用
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- MySQL数据库在高并发下的优化方案