数据绑定库|Android开发者 (二)

来源:互联网 发布:美国wpi数据 编辑:程序博客网 时间:2024/05/30 02:53

来源:https://developer.android.google.cn/topic/libraries/data-binding/index.html#layout_details

页面语言:英文


Layout Details

Imports

零层或更多import的元件可以在内部使用data元件。这允许您的布局文件中容易参考类,就像在Java中。

<data>    <import type="android.view.View"/></data>

现在,可以查看你的绑定表达式中使用:

<TextView   android:text="@{user.lastName}"   android:layout_width="wrap_content"   android:layout_height="wrap_content"   android:visibility="@{user.isAdult ? View.VISIBLE : View.GONE}"/>

adult 成年人

当有类名称冲突,其中一个类可以被重命名为一个“别名”

<import type="android.view.View"/><import type="com.example.real.estate.View"        alias="Vista"/>

现在,Vista可以被用于引用 com.example.real.estate.View和 View可被用于引用 android.view.View该布局文件中。import类型可以被用作变量和表达式类型的引用:

<data>    <import type="com.example.User"/>    <import type="java.util.List"/>    <variable name="user" type="User"/>    <variable name="userList" type="List&lt;User&gt;"/></data>
// MainActivity.java 代码@Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);        User user = new User("test first", "test last", false);        binding.setUser(user);        List<User> userList = new ArrayList<>();        for (int i = 0; i < 10; i++) {            boolean isAdult = i % 2 == 0;            userList.add(new User("test first" + i, "test last" + i, isAdult));        }        binding.setUserList(userList); // 设置userList    }

注:Android的工作室还没有办理进口使import变量自动完成可能无法在你的IDE工作。
您的应用程序仍然会编译很好,你可以通过在变量定义中使用完全合格的名字解决的IDE问题。

<TextView   android:text="@{((User)(user.connection)).lastName}"   android:layout_width="wrap_content"   android:layout_height="wrap_content"/>

在表达式中引用静态字段和方法时,import类型,也可以使用:

<data>    <import type="com.example.MyStringUtils"/>    <variable name="user" type="com.example.User"/></data><TextView   android:text="@{MyStringUtils.capitalize(user.lastName)}"   android:layout_width="wrap_content"   android:layout_height="wrap_content"/>

正如在Java中,java.lang.*将自动导入。


变量

任何数量的variable元件可以在内部使用data元件。每个 variable元素描述了可以在布局被设置在布局文件中的绑定表达式中使用的属性。

<data>    <import type="android.graphics.drawable.Drawable"/>    <variable name="user"  type="com.example.User"/>    <variable name="image" type="Drawable"/>    <variable name="note"  type="String"/></data>

变量类型是在编译时检查,因此,如果一个变量器具 Observable或者是观察到的集合,这应该在类型中得到反映。如果变量是一个基类或接口没有实现可观测*接口,变量将不会被发现!

Observable变量可实时更新UI

当有各种配置(例如,横向或纵向)不同的布局文件,变量将被合并。不能有这些布局文件之间相互冲突的变量定义。

生成的绑定类将具有用于每个所描述的变量的设定器和吸气剂。-直到调用setter时的变量将采取默认的Java值null对于引用类型, 0对int,false对 boolean,等等。

一个特殊的变量context用于生成按需要绑定表达式。该值context是 Context从根查看的getContext()。该context变量将用该名称明确的变量声明被覆盖。


自定义绑定类名

默认情况下,基于所述布局文件的名称,用大写启动它产生Binding类,除去下划线(_)和利用下列字母,然后后面添加“绑定”。这个类将被放置在数据绑定包中的模块封装下。例如,布局文件contact_item.xml就会产生 ContactItemBinding。如果模块包 com.example.my.app,那么它将被放置在 com.example.my.app.databinding。

绑定类可以重命名或通过调节放置在不同的包class中的属性 data元素。例如:

<data class="ContactItem">    ...</data>

这产生的结合类作为ContactItem在数据绑定包中的模块封装。如果该类应该在不同的包的模块封装内产生,它可以与前缀“”:

<data class=".ContactItem">    ...</data>

在这种情况下,ContactItem在直接在模块封装件产生的。如果提供完整的包,可以使用任何包:

<data class="com.example.ContactItem">    ...</data>

Includes

<?xml version="1.0" encoding="utf-8"?><layout xmlns:android="http://schemas.android.com/apk/res/android"        xmlns:bind="http://schemas.android.com/apk/res-auto">   <data>       <variable name="user" type="com.example.User"/>   </data>   <LinearLayout       android:orientation="vertical"       android:layout_width="match_parent"       android:layout_height="match_parent">       <include layout="@layout/name"           bind:user="@{user}"/>       <include layout="@layout/contact"           bind:user="@{user}"/>   </LinearLayout></layout>

这里,必须有user两个变量 name.xml和contact.xml布局文件。
数据绑定不支持包括作为合并元素的直接孩子。
例如, 不支持以下布局:

<?xml version="1.0" encoding="utf-8"?><layout xmlns:android="http://schemas.android.com/apk/res/android"        xmlns:bind="http://schemas.android.com/apk/res-auto">   <data>       <variable name="user" type="com.example.User"/>   </data>   <merge>       <include layout="@layout/name"           bind:user="@{user}"/>       <include layout="@layout/contact"           bind:user="@{user}"/>   </merge></layout>

表达式语言

共同特征

表达式语言看起来很像一个Java表达式。这些是相同的:

  • 数学的 + - / * %
  • 字符串连接 +
  • 合乎逻辑 && ||
  • 二进制 & | ^
  • 一元 + - ! ~
  • 转移 >> >>> <<
  • 对照 == > < >= <=
  • instanceof
  • Grouping ()
  • 文字 - character, String, numeric, null
  • Cast
  • 方法调用
  • Field access
  • 数组访问 []
  • 三元运算符 ?:

例子:

android:text="@{String.valueOf(index + 1)}"android:visibility="@{age < 13 ? View.GONE : View.VISIBLE}"android:transitionName='@{"image_" + id}'

====

缺少操作

一些操作是从,你可以在Java中使用表达式语法失踪。

  • this
  • super
  • new
  • 显式调用通用

====

空合并运算符
空合并运算符(??)
如果它不为空或对的,选择左边的操作数;
如果它是空的,选择右边的操作符。

android:text="@{user.displayName ?? user.lastName}"

这是功能上等同于:

android:text="@{user.displayName != null ? user.displayName : user.lastName}"

====

属性参考

首先是已经在讨论编写第一个数据绑定表达式简称JavaBean的引用:以上。当表达式引用上的类的属性,它使用字段,吸气剂,并ObservableFields相同的格式。

android:text="@{user.lastName}"

====

避免NullPointerException异常

生成的数据绑定代码自动检查空值和避免空指针的异常。例如,在表达式 @{user.name}中,如果user为空, user.name将被分配它的默认值(NULL)。如果你参考user.age,其中,年龄是一个int,那么它会默认为0。

====

集合

常见的集合:arrays, lists, sparse lists, and maps,可以通过访问 [] 提供方便。

<data>    <import type="android.util.SparseArray"/>    <import type="java.util.Map"/>    <import type="java.util.List"/>    <variable name="list" type="List&lt;String&gt;"/>    <variable name="sparse" type="SparseArray&lt;String&gt;"/>    <variable name="map" type="Map&lt;String, String&gt;"/>    <variable name="index" type="int"/>    <variable name="key" type="String"/></data>…android:text="@{list[index]}"…android:text="@{sparse[index]}"…android:text="@{map[key]}"

====

字符串字面

当使用属性值围绕单引号,很容易在表达式中使用双引号:

android:text='@{map["firstName"]}'

也可以用双引号包围的属性值。在这样做时,字符串应该要么使用“或反引号(’)。

android:text=”@{map[firstName}”
android:text=”@{map[‘firstName’]}”

====

资源

它可以访问资源使用正常的语法表达式的一部分:

android:padding="@{large? @dimen/largePadding : @dimen/smallPadding}"

格式字符串和复数可通过提供参数进行评估:

android:text="@{@string/nameFormat(firstName, lastName)}"android:text="@{@plurals/banana(bananaCount)}"

当复数有多个参数,所有参数应该传递:

Have an orange  Have %d orangesandroid:text="@{@plurals/orange(orangeCount, orangeCount)}"

有些资源需要显式类型的评价。

类型 正常参考 表达参考
这里写图片描述


end

原创粉丝点击