专栏首页大话swiftkotlin如何使用MVVM的开发模式

kotlin如何使用MVVM的开发模式

互联网开发模式经历了MVC、MVP。Android本身的开发模式为MVC,前些年MVP大行其道,这两年MVVM逐渐开始流行,最近准备用kotlin开发一个项目,顺便了解一下MVVM。

我采用的Android studio版本如下,因为大家会在软件版本上出问题,所以特意给大家贴出来我的版本

首先、建立一个新的Android工程,开发语言选择kotlin,如下图所示

其次、修改工程下的

C:\kotlin\live\app\build.gradle

apply plugin: 'com.android.application'apply plugin: 'kotlin-android'apply plugin: 'kotlin-android-extensions'apply plugin: 'kotlin-kapt'
android {    compileSdkVersion 29    buildToolsVersion "29.0.3"
    defaultConfig {        applicationId "com.xiangshike.live"        minSdkVersion 21        targetSdkVersion 29        versionCode 1        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"    }
    buildTypes {        release {            minifyEnabled false            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'        }    }    dataBinding {        enabled = true    }    androidExtensions {        experimental = true    }}
dependencies {    implementation fileTree(dir: 'libs', include: ['*.jar'])    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"    implementation 'androidx.appcompat:appcompat:1.1.0'    implementation 'androidx.core:core-ktx:1.2.0'    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'    testImplementation 'junit:junit:4.12'    androidTestImplementation 'androidx.test.ext:junit:1.1.1'    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'}

开启kotlin的支持

apply plugin: 'kotlin-android'apply plugin: 'kotlin-android-extensions'apply plugin: 'kotlin-kapt'

开启dataBinding的支持

    dataBinding {        enabled = true    }

新建一个基类BaseActivity

package com.xiangshike.live.base
import android.os.Bundleimport androidx.appcompat.app.AppCompatActivityimport androidx.databinding.DataBindingUtilimport androidx.databinding.ViewDataBinding
abstract class BaseActivity<DB : ViewDataBinding> : AppCompatActivity() {    lateinit var mDataBind: DB
    override fun onCreate(savedInstanceState: Bundle?) {        super.onCreate(savedInstanceState)        mDataBind = DataBindingUtil.setContentView<DB>(this, getLayoutId())        initData()        initView()    }
    abstract fun getLayoutId(): Int
    override fun onDestroy() {        super.onDestroy()        mDataBind.unbind()    }
    abstract fun initData()    abstract fun initView()}

建立一个模型

package com.xiangshike.live.model
data class User(val name: String)

建立MainActivity继承BaseActivity

package com.xiangshike.live
import android.text.Editableimport android.text.TextWatcherimport com.xiangshike.live.base.BaseActivityimport com.xiangshike.live.databinding.ActivityMainBindingimport com.xiangshike.live.model.Userimport kotlinx.android.synthetic.main.activity_main.*
class MainActivity : BaseActivity<ActivityMainBinding>() {    private var user = User("hanyun")    override fun getLayoutId(): Int = R.layout.activity_main    override fun initData() {        mDataBind.user = user    }
    override fun initView() {        editText.addTextChangedListener(object : TextWatcher {            override fun afterTextChanged(s: Editable?) {                mDataBind.user = user.copy(name = editText.text.toString())            }
            override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {            }
            override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {            }        })    }}

在这里要强调一下 BaseActivity这里的ActivityMainBinding的写法,然后编译一下导入包

视图的名称转换为每个单词的首字母大写+Binding,例如activity_main.xml=>ActivityMainBinding

视图activity_main.xml

<?xml version="1.0" encoding="utf-8"?><layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <variable            name="user"            type="com.xiangshike.live.model.User" />    </data>
    <LinearLayout        android:layout_width="match_parent"        android:layout_height="match_parent"        android:orientation="vertical">
        <TextView            android:id="@+id/tv"            android:layout_width="match_parent"            android:layout_height="wrap_content"            android:text="@{user.name}" />
        <EditText            android:id="@+id/editText"            android:layout_width="match_parent"            android:layout_height="wrap_content" />
    </LinearLayout>

</layout>

其中,这里定义的变量名称user和MainActivity中mDataBind.user一致

        <variable            name="user"            type="com.xiangshike.live.model.User" />

这里的@{user.name}表示给模板赋值

        <TextView            android:id="@+id/tv"            android:layout_width="match_parent"            android:layout_height="wrap_content"            android:text="@{user.name}" />

最终的项目结构如下图

当我们修改了EditText的内容,TextView的内容也跟着改变了,从而实现数据绑定。

本文分享自微信公众号 - 大话swift(gh_ca2266b7cab0),作者:寒云

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-04-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • kotlin构建MVVM应用之双向数据绑定

    我们在构建MVVM应用的时候数据时双向流动的,比如:用户输入了数据,那么我们的model层的数据也要自动跟着更新或者我们校验了数据,是图层也要给用户反馈;网络请...

    大话swift
  • Android 集成百度地图那些事

    implementation files('libs/BaiduLBS_Android.jar')

    大话swift
  • Android layer实现圆角 阴影

    在drawable的那个layer布局xml中采用item的方式将各个图形控制分开,依照层级堆叠

    大话swift
  • Android BottomSheet实现可拉伸控件

    Bottom Sheet是Design Support Library23.2 版本引入的一个类似于对话框的控件。 Bottom Sheet中的内容默认是隐藏起...

    砸漏
  • Kotlin与Databinding(一)简介封装

    code_horse
  • SQLite的增删改查

    Dream城堡
  • 安卓中的数据存取

    在我们每天使用的手机设备中,无时无刻都在进行着数据的存和取。安卓作为一种手机操作系统,提供了如下方式的数据存取方式:Preference,File,Sqlite...

    lzugis
  • 拖动条SeekBar及星级评分条

    1.布局 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"...

    欢醉
  • [android] 练习样式主题自定义activity切换动画

    主要练习了自定义样式和主题,继承android系统默认的样式并修改,练习xml定义淡入淡出动画

    陶士涵
  • 全面总结侧滑菜单的5种实现方式

    现在开发中,很多APP都在用侧滑菜单,这个很常见,也有很多第三方库,比如slidingmenu,谷歌官方的DrawerLayout等等。下面我就总结一下侧滑菜单...

    AWeiLoveAndroid

扫码关注云+社区

领取腾讯云代金券