版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_28268507/article/details/78485715
Android DataBinding语法规范:
详细请参考 简书博客 或者 Github Demo
基本用法:
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
//class属性定义了DataBinding的类型,如果使用了class属性,则不在根据layout名称生成相应DataBinding了
<data class=".ContractBinding">
//import标签导包,alias 表示别名
<import type="com.liangfeizc.databinding.model.User"/>
<import type="com.liangfeizc.databinding.utils.MyStringUtils" alias="StringUtils" />
<import type="android.view.View" />
<variable name="user" type="User" />
</data>
</layout>
基本语法:
android:visibility="@{user.isAdult ? View.VISIBLE : View.GONE}"//支持三元运算符。需要导入View包
android:text="@{String.valueOf(user.age)}"//前面说了,@{只能是String},为什么,可以看3.1,匹配规则
android:text="@{StringUtils.capitalize(user.firstName)}"//前面导入了这个包,可以调用这个静态方法
android:text="@{user.displayName ?? user.lastName}"//它表达的是如果左边不是 null 的,那么使用左边的值,否者使用右边的值。在棉花糖的文章里有介绍
android:background="@{isError.get() ? @color/red : @color/white}"//三目运算符
include布局时变量的传递:
<layout xmlns:android="http://schemas.android.com/apk/res/android"
//名称空间
xmlns:bind="http://schemas.android.com/apk/res-auto">
<data>
<import type="com.liangfeizc.databinding.model.User" />
<variable
name="user"
type="User" />
<variable
name="listener"
type="com.liangfeizc.databinding.listener.OkListener" />
<variable
name="okText"
type="String" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<include
android:id="@+id/layout_input"
layout="@layout/layout_input" />
<include
//注意:bind为名称空间,user为布局中的一个相同类型的变量名
layout="@layout/user"
bind:user="@{user}" />
<include
//注意:这里okText,listener都在layout_btn_ok布局中存在相同的变量名,并且类型也要保持一致
layout="@layout/layout_btn_ok"
bind:okText="@{okText}"
bind:listener="@{listener}"/>
</LinearLayout>
</layout>
集合使用:
<data class="CollectionsBinding">
<import type="java.util.Map" />
<import type="java.util.List" />
<import type="android.util.SparseArray" />
//List<String表示List里面的值为String类型
<variable name="list" type="List<String>" />
<variable name="sparse" type="SparseArray<String>"/>
//Map<String, String表示,map中key,value的值都是String类型的
<variable name="map" type="Map<String, String>"/>
//position,默认为0,需要的时候请手动设置
<variable name="index" type="int" />
<variable name="key" type="String" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textStyle="bold"
android:text="list[index]:" />
<TextView
android:text="@{list[index]}"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textStyle="bold"
android:text="sparse[index]:" />
<TextView
android:text="@{sparse[index]}"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textStyle="bold"
android:text="map[key]:" />
<TextView
android:text="@{map[key]}"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<View
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@android:color/black" />
<TextView
android:text='map["firstName"]'
android:textStyle="bold"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:text='@{map["firstName"]}'
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:text="map[`firstName`]"
android:textStyle="bold"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:text="@{map[`firstName`]}"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:text="map[&quot;firstName&quot;]"
android:textStyle="bold"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:text="@{map["firstName"]}"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
本地资源的引用:
<data class="ResourceBinding">
<variable name="large" type="boolean" />
<variable name="firstName" type="String" />
<variable name="lastName" type="String" />
<variable name="bananaCount" type="int" />
<variable name="orangeCount" type="int" />
</data>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:padding="@{large? (int)@dimen/largePadding : (int)@dimen/smallPadding}"
android:background="@android:color/black"
android:textColor="@android:color/white"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
<TextView
android:text="@{@string/nameFormat(firstName, lastName)}"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:text="@{@plurals/banana(bananaCount)}"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:text="@{@plurals/orange(orangeCount, orangeCount)}"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
//string.xml文件内容
<string name="nameFormat">Full Name: %1$s:%2$s</string>
<string name="nameFormatWithAge">Hello %1$s %2$s, %3$d ages</string>
<plurals name="banana">
<item quantity="zero">zero bananas</item>
<item quantity="one">one banana</item>
<item quantity="two">two bananas</item>
<item quantity="few">few bananas</item>
<item quantity="many">many bananas</item>
<item quantity="other">other bananas</item>
</plurals>
<plurals name="orange">
<item quantity="one">Have an orange</item>
<item quantity="other">Have %d oranges</item>
</plurals>
ViewStub:
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin" >
<Button
android:text="Inflate the ViewStub"
android:onClick="inflateViewStub"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<ViewStub
android:id="@+id/view_stub"
android:layout="@layout/view_stub"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
</layout>
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mBinding = DataBindingUtil.setContentView(this, R.layout.activity_view_stub);
mBinding.viewStub.setOnInflateListener(new ViewStub.OnInflateListener() {
@Override
public void onInflate(ViewStub stub, View inflated) {
ViewStubBinding binding = DataBindingUtil.bind(inflated);
User user = new User("liang", "fei");
binding.setUser(user);
}
});
}
public void inflateViewStub(View view) {
if (!mBinding.viewStub.isInflated()) {
mBinding.viewStub.getViewStub().inflate();
}
}