美文网首页我爱编程
4.kotlin安卓实践课程-用kotlin写第一个activi

4.kotlin安卓实践课程-用kotlin写第一个activi

作者: 呵呵_9e25 | 来源:发表于2018-05-30 15:29 被阅读0次

    简介

    主要会通过安卓实战来讲解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

    相关文章

      网友评论

        本文标题:4.kotlin安卓实践课程-用kotlin写第一个activi

        本文链接:https://www.haomeiwen.com/subject/omgtsftx.html