首发于公众号: DSGtalk1989
-
DataBinding
首先我们需要在module的
build.gradle
文件中打开databinding
的开关。android { ... dataBinding { enabled = true } }
然后我们在
layout
布局文件中,添加<data>
标签,并且将根布局标签修改成<layout>
<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="data" type="org.salamanca.kotlinframe.bean.WeatherData"/> </data> <LinearLayout android:orientation="vertical" android:layout_margin="4dp" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@{data.location}" android:textSize="18sp" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@{data.temperature}" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@{data.info}" /> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@{data.imageUrl}" /> <Button android:text="改变" android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="changeTemperatureAndImage" /> </LinearLayout> </layout>
以上的这些都跟我们的kotlin没什么关系。我们直接来看数据类的定义,以及binding的使用吧。
data class WeatherData( var location: String, var temperature: String, var info: String, var imageUrl: String ) : BaseObservable()
这里你可以选择是否要使用
data
,但是考虑到databinding
必须继承BaseObservable
。然后在我们的activity中只需要通过
DataBindingUtil
工具,进行布局页面和资源绑定即可。val weather = WeatherData( "Saint Petersburg", "10 °C", "Cloudy with rain and possible thunderstorms", "http://loremflickr.com/800/600/city") var counter = 1 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val binding: ActivityDemoBinding = DataBindingUtil.setContentView(this, R.layout.activity_demo) binding.data = weather } fun changeTemperatureAndImage(view: View) { ++counter weather.temperature = "$counter °C" weather.imageUrl = "http://loremflickr.com/800/600/city?random=$counter" weather.notifyChange() }
-
livedata,viewmodel
- 依赖
dependencies { // ViewModel and LiveData implementation "android.arch.lifecycle:extensions:1.1.1" // alternatively, just ViewModel implementation "android.arch.lifecycle:viewmodel:1.1.1" // alternatively, just LiveData implementation "android.arch.lifecycle:livedata:1.1.1" annotationProcessor "android.arch.lifecycle:compiler:1.1.1" }
compiler
是都需要的,其他的我们视情况依赖,虽然一般情况下,两者都是一起出现的。版本号大家可以前往MavenRepository(https://mvnrepository.com/artifact/android.arch.lifecycle/extensions)通常的玩法概括下来如下:
-
针对界面写一个
ViewModel
class DemoViewModel : ViewModel() { }
-
ViewModel
中包含一个MutableLiveData
var demoLiveData: MutableLiveData<String> = MutableLiveData()
-
我们可以针对
demoLiveData
做各种数据变动。fun changeIt(value : String){ demoLiveData.value = value }
-
最终我们在
Activity
或Fragment
中做绑定viewModel = ViewModelProviders.of(this).get(DemoViewModel::class.java) viewModel.demoLiveData.observe(this, Observer { tvDemo = it })
这样一来,只要我们的
demoLiveData
的内容发生了任何变化,都会随时的在tvDemo
控件上反应出来。相比
DataBinding
来说,会更加的容易调试,通过布局文件绑定数据关系会加大绑定的难度;可以对生命周期进行管理,在销毁的时候进行统一的回收;以及对于开发者来说,更容易接受这种方式来实现数据的双向绑定。