Android DataBinding语法规范

版权声明:本文为博主原创文章,未经博主允许不得转载。 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&lt;String表示List里面的值为String类型
    <variable name="list" type="List&lt;String>" />
    <variable name="sparse" type="SparseArray&lt;String>"/>

    //Map&lt;String, String表示,map中key,value的值都是String类型的
    <variable name="map" type="Map&lt;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[&amp;quot;firstName&amp;quot;]"
        android:textStyle="bold"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <TextView
        android:text="@{map[&quot;firstName&quot;]}"
        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();
    }
}

动态更新数据,参考博客 CSDN 博客

猜你喜欢

转载自blog.csdn.net/qq_28268507/article/details/78485715