简述
本文主旨讲安卓的数据层,设计一些简单的数据与组件之间的交互,也就是绑定。api通信这个环境是app交互极为重要的,比那些代码的质量,以及后期维护新增开发大部分代码就是这个环节所衍生的。
不要去看官方文档,太繁琐了。有更好的方案基于kotlin实现viewmodel,那就是fragment-ktx。一句话总结fragment-ktx集成ViewModel、AndroidViewModel和SavedStateHandle。
安装插件
jvmTrage需要一点1.8以上
android {
compileSdkVersion 29
buildToolsVersion "29.0.3"
viewBinding {
enabled = true
}
kotlinOptions {
jvmTarget = 1.8
}
defaultConfig {
applicationId "com.example.viewbinding"
minSdkVersion 16
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'
}
}
compileOptions {
targetCompatibility = 1.8
}
}
创建一个数据模型
package com.example.viewbinding
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
class Data1Model: ViewModel() {
// 内部模型
private val _number =MutableLiveData<Int>().also {
it.value = 0
}
// 对外模型
val number:LiveData<Int> = _number
// 模型方法
fun addOne(it:Int){
_number.value = _number.value?.plus(1)
}
}
注释:内部模型用来存储api返回的数据,对外模型存放那些可能通过交互,或者处理加工过的内部数据。至于模型方法则用来处理业务逻辑。
实现数据viewModel和数据绑定
package com.example.viewbinding
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.os.PersistableBundle
import androidx.activity.viewModels
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModel
import com.example.viewbinding.databinding.ActivityMainBinding
import kotlinx.android.synthetic.main.fragment_blank.*
class MainActivity : AppCompatActivity() {
// 声明变量
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 接入插件
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
val data1Model by viewModels<Data1Model>()
// 模型数据绑定
data1Model.number.observe(this, Observer {
binding.tit1.text = it.toString()
})
// 模型事件版本
binding.button.setOnClickListener({
data1Model.addOne(1)
})
}
override fun onStart() {
super.onStart()
}
}
注解:以上代码作为参考,局部的数据可能使用与当前的方法。但我认为viewMode的事件,数据直接绑定wml会更好。
ViewModel 的生命周期
Fragment下使用 viewModel
package com.example.viewbinding
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.viewModels
import androidx.lifecycle.Observer
import com.example.viewbinding.databinding.FragmentHomeBinding
/**
* A simple [Fragment] subclass.
*/
class HomeFragment : Fragment() {
private lateinit var binding: FragmentHomeBinding
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
binding = FragmentHomeBinding.inflate(layoutInflater)\
// 引入数据模型
val data1Model:Data1Model by viewModels<Data1Model>()
binding.textView.text = data1Model.number.toString()
data1Model.number.observe(viewLifecycleOwner, Observer {
binding.textView.text = it.toString()
})
binding.button2.setOnClickListener({
data1Model.addOne(1)
})
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
}
}