1.配置如下:
Project build_gradle
buildscript {
ext.kotlin_version = '1.2.21'
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.0.1'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
app build_gradle
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
android {
... ...
dataBinding {
enabled true
}
}
kapt {
generateStubs = true
}
dependencies {
//DataBind
kapt "com.android.databinding:compiler:2.3.0"
}
2. 使用如下:
2.1 在Activity中使用
DataBindingUtil.setContentView(this@MainActivity, R.layout.activity_main)
mContentView.userInfo = UserInfo("马齐", "18", "188")
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<import type="com.apicloud.pkg.sdk.data.UserInfo" />
<variable
name="userInfo"
type="UserInfo" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{userInfo.name}" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{userInfo.age}" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{userInfo.higeht}" />
<FrameLayout
android:layout_width="match_parent"
android:id="@+id/main_container"
android:layout_height="match_parent"></FrameLayout>
</LinearLayout>
</layout>
2.2 在Fragment中使用
fun toInit() {
mContentView.endModel = EndModel(Calendar.getInstance().timeInMillis,
"点我有惊喜", false)
mContentView.imageUrl = "http://images.csdn.net/20150810/Blog-Image%E5%89%AF%E6%9C%AC.jpg"
mContentView.changeTime.onClick {
mContentView.endModel.time = Calendar.getInstance().timeInMillis
mContentView.endModel.showRed = !mContentView.endModel.showRed
mContentView.endModel.showView.set(!mContentView.endModel.showView.get())
}
//我使用的是IRecyclerView库 看起来是不是很简单?
mContentView.layoutManager = LinearLayoutManager(context)
val baseReclyerViewAdapter = object : CommonRecycleViewAdapter<PageModel>(context, R.layout.item_page) {
override fun convert(helper: ViewHolderHelper?, t: PageModel?, position: Int) {
}
}
mContentView.adapter = baseReclyerViewAdapter
for (i in 1..10) {
baseReclyerViewAdapter.add(PageModel())
}
}
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<!--这个和 java 中使用一样,导入 View 类 可使用类方法-->
<import type="android.view.View" />
<!--可以理解为 Bean 对象-->
<import type="com.apicloud.pkg.sdk.data.EndModel" />
<!--可使用 Utils 的类方法-->
<import type="com.apicloud.pkg.sdk.utils.UtilsKt" />
<!--声明变量名 Databinding会自动生成 set 和 get 方法-->
<variable
name="endModel"
type="EndModel" />
<!--声明变量名 Databinding会自动生成 set 和 get 方法-->
<variable
name="adapter"
type="android.support.v7.widget.RecyclerView.Adapter" />
<!--声明变量名 Databinding会自动生成 set 和 get 方法-->
<variable
name="layoutManager"
type="android.support.v7.widget.RecyclerView.LayoutManager" />
<!--声明变量名 Databinding会自动生成 set 和 get 方法-->
<variable
name="imageUrl"
type="String" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<!--根据showView的值显示隐藏 注意:不要使用isTrue 这样的变量名 编译时会出现true的关键词冲突-->
<TextView
android:id="@+id/next"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="@{endModel.showView?View.VISIBLE:View.GONE}" />
<!--这是字符串拼接操作 String.valueOf()为Long转换字符串操作-->
<!-- next.visibility 为跟随 next 布局显示和隐藏
注意:一定要在next下申明 不然编译报错 这种局限可用RelativeLayout解决-->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{@string/nameFormat(endModel.result,String.valueOf(endModel.time))}"
android:visibility="@{next.visibility}"></TextView>
<!--使用 Utils 的静态方法 将 Long转换成日期(String)类型-->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{UtilsKt.long2Data(endModel.time)}"></TextView>
<!--根据 shwoRed 显示不同的颜色-->
<Button
android:id="@+id/change_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@{endModel.showRed?@color/color_999999 : @color/color_FF244F}"
android:text="@{endModel.result}" />
<!-- 注意:app:image 此为DataBinding的自定义属性 -->
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:image="@{imageUrl}" />
<!-- 说实话没搞明白 此 app:adapter app:layoutManager 的任何修改 都会报编译异常
应该是查找不到 改类的setAdapter() 以及 setLayoutManager()方法 -->
<com.aspsine.irecyclerview.IRecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent"
app:adapter="@{adapter}"
app:layoutManager="@{layoutManager}" />
<!-- app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"--!>
</LinearLayout>
</layout>
<string name="nameFormat">%s, %s</string>//组合字符串
<color name="color_999999">#999999</color>
<color name="color_FF244F">#FF244F</color>
<color name="color_E5E5E5">#e5e5e5</color>
Utils.kt
fun long2Data(data: Long): String = SimpleDateFormat("yyyy-MM-dd").format(Date(data))
BindingUtil.kt
这个BindingUtil 是可以随便名明的DataBinding会自动寻找到该方法
@BindingAdapter("bind:image")
fun ImageView.imageLoader(url: String) {
Glide.with(context).load(url).into(this)
}
//这个BindingConversion真的不实用 如果参数为String或者Int类型将会造成 其他不想使用该方法的布局也被迫使用
不推荐
//@BindingConversion
//fun convertDate(date: Date): String {
// return SimpleDateFormat("yyyy-MM-dd").format(date)
//}
最后 在我GitHub上有源代码 https://github.com/goodluckforme/APiCloudDemo
自己学习也方便大家。
持续更新中...
PS:这是基于我的MVP模板写的,别忘了我的一键 MVP快速开发神器,欢迎来Start
GitHub https://github.com/goodluckforme/muc_mvp/tree/second
Blog http://blog.csdn.net/qq_20330595/article/details/79269581
AS3.3以后 Databinding用法有所更新