DataBinding(二):DataBinding的基本用法

转自:DataBinding系列(二):DataBinding的基本用法

1.在xml中引入一些基础变量Variables

data 标签中可以有任意数量的 variable 标签。这些变量可以使Java中的任意数据类型,每个 variable 标签描述了会在 binding 表达式中使用的属性。

<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <variable
            name="str"
            type="String"/>
        <variable
            name="age"
            type="int" />
    </data>  

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{str}"/>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{String.valueOf(age)}"/>
    </LinearLayout>
</layout>

Data Binding和Java一样,java.lang包里的类,我们是可以不用导入包的,也就是说,java基础类型都是不用导包的。注意:android:text设置int类型的值一定要转化为String类型,否则系统会认为是资源文件id,就会出错*

2.引入一些高级变量Variables

在上面,我们学会了如何在xml中定义变量,以及在控件中使用。同样,我们可以在data中定义像List、Map,数组等这样的集合变量,只是它的实现稍微有点不同,下面就一起来看看是如何定义以及使用的。

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <data>
        <import type="java.util.List" />
        <import type="java.util.Map" />

        <!--泛型的支持会在编译时期报红线,但是是可以直接运行的
       但是需要通过转义字符才行,如:<号用&lt表示;>号用&gt表示;-->
       <variable
            name="list"
            type="List<String>" />

        <variable
            name="map"
            type="Map<String,Object>" />

        <variable
            name="array"
            type="String[]" />
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="15dp"
        android:orientation="vertical">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{list[0]}" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{list.get(1)}" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:text="@{map[`key0`]}" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{map.get(`key1`)}" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:text="@{array[0]}" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{array[1]}" />

    </LinearLayout>
</layout>   

大家可以看到,list和map这里我没有用List

在Activity中初始化数据,设置这些变量

public class BasicActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ActivityBasicBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_basic);

        List<String> list = new ArrayList<>();
        list.add("list1");
        list.add("list2");
        binding.setList(list);

        HashMap<String, Object> map = new HashMap<>();
        map.put("key0", "map_value0");
        map.put("key1", "map_value1");
        binding.setMap(map);

        String[] arrays = {"字符串1", "字符串2"};
        binding.setArray(arrays);
    }
}

3.xml中引用表达式

举几个例子,还有很多,大多数Java表达式都是支持的

android:text="@{String.valueOf(age)}"
android:visibility="@{age < 13 ? View.GONE : View.VISIBLE}"
android:text=‘@{"iname:" +user.name}‘

此外还支持null合并操作,它的符号是??,意思是:如果左边的对象非空则选择左边,否则选择右边,这和Java中的三目运算符是一样的,可以算是一个简略吧。

android:text="@{user.displayName ?? user.lastName}"
//等价于
android:text="@{user.displayName != null ? user.displayName : user.lastName}"

原文地址:https://www.cnblogs.com/xl-phoenix/p/9131647.html

时间: 2024-08-02 03:57:54

DataBinding(二):DataBinding的基本用法的相关文章

mysql学习之二:mysql基本用法

安装完mysql后我们可以进行sql语句的操作: 我们可以使用以下命令连接到MySQL服务: mysql -h localhost -u root -p -h参数指定要连接的MySQL服务器地址 -u参数指定连接所使用的用户 -p参数指定使用密码验证登陆 MySQL服务绝大多数功能使用SQL语言进行管理. SQL语言一般约定俗成使用大写,但是语言本身不限制大小写.几乎所有SQL语句都必须以";"结尾. 列出所有数据库: SHOW DATABASES; 创建一个数据库(linuxcast

Spring中的DataBinding(二) - Validation

@Controller@RequestMapping(value = "/custom/register")public class RegistrationController { // Set the data binding per controller @InitBinder public void initBinder(WebDataBinder binder){ binder.setDisallowedFields("id"); // 此处指定在绑定的时

Dynamic CRM 2013学习笔记(二)插件基本用法及调试

插件是可与 Microsoft Dynamics CRM 2013 和 Microsoft Dynamics CRM Online 集成的自定义业务逻辑(代码),用于修改或增加平台的标准行为.也可以将插件认为是针对 Microsoft Dynamics CRM 触发的事件的处理程序.您可以让插件订阅或注册已知事件集,以便在事件发生时运行您的代码.   一.基本用法 1. 要继承IPlugin,并实现Excute方法 ( 1- 3 行) 2. 从service provide 里获取执行上下文 (

缓存二、HttpRuntime.Cache用法

上一篇写了Asp.net页面缓存,本篇介绍在服务器端进行缓存.微软.net给我提供了HttpRuntime.Cache对象进行缓存.个人对缓存的理解是,将从数据库.文件.或业务逻辑计算出来的数据,保存在内存中,当下一次遇到相同内容的请求就直接将保存在内存中的数据返回给请求者.这样做的好处是可以提高访问效率,减少文件或是数据库的读取,属于"以空间换时间",适当的运用好Cache可以很大程度提高程序性能.关于Cache本文所包含的内容有 Page.Cache,HttpRuntime.Cac

Cluster基础(二):ipvsadm命令用法、部署LVS-NAT集群、部署LVS-DR集群

一.ipvsadm命令用法 目标: 准备一台Linux服务器,安装ipvsadm软件包,练习使用ipvsadm命令,实现如下功能: 使用命令添加基于TCP一些的集群服务 在集群中添加若干台后端真实服务器 实现同一客户端访问,调度器分配固定服务器 会使用ipvsadm实现规则的增.删.改 保存ipvsadm规则 方案: 安装ipvsadm软件包,关于ipvsadm的用法可以参考man ipvsadm资料.常用ipvsadm命令语法格式如下表所示. 步骤: 步骤一:使用命令增.删.改LVS集群规则

Spring MVC 学习笔记(二):@RequestMapping用法详解

一.@RequestMapping 简介 在Spring MVC 中使用 @RequestMapping 来映射请求,也就是通过它来指定控制器可以处理哪些URL请求,相当于Servlet中在web.xml中配置 <servlet>     <servlet-name>servletName</servlet-name>     <servlet-class>ServletClass</servlet-class> </servlet>

ListView详解(二)之simpleAdapter用法

一.SimpleAdapter的参数说明 SimpleAdapter(Context  context, List<? extends Map<String, ?>>  data, int resource, String[]  from, int[] to) 第一个参数 表示上下文 第二个参数表示生成一个Map(String ,Object)列表选项 第三个参数表示界面布局文件的ID,  表示该文件作为列表项的组件 第四个参数表示该Map对象的哪些key对应value来生成列表项

js sort 二维数组排序的用法小结

最近在搞js 排序的问题,因为数据库排序太耗资源,如果能转移到客户端去排序,能大大D减少服务器内存消耗.客户端的话,除了js,就是as了,可惜我as学得太烂,所以只能选择js来研究研究了...经过我的测试,js内置方法sort的效率非常高 我们知道在js中默认提供了sort函数,但是这个函数默认是按照数组内容的ascii码升序进行排列的,如果我们要对二维数组排序要如何做呢?在php中是有multi_sort函数可供调用的,但是在js中似乎没有这种函数,但是没关系 ,因为js的sort函数其实也提

go语言从零学起(二)--list结构基本用法

list,go标准库双向链表结构 定义: a := list.New() 用法示例: package main import ( "container/list" "fmt" ) func main() { l := list.New() l.PushBack(1) //插入链表的最后一个位置 l.PushBack(2) l.PushBack(3) l.PushFront(4) //插入链表的第一个位置 i := 1 for e := l.Front(); e !=

C语言二维数组的用法

二维数组在声明的时候可以直接全部赋值,如: int a[2][3] ={ {1,2,3}, {4,5,6} }; 不能先申明再全部赋值,如下方式是错误的: int a[2][3]; a[2][3]={ {1,2,3}, {4,5,6} };