美文网首页Android知识Android开发Android技术知识
[翻译] Android Data Binding(2): 关于

[翻译] Android Data Binding(2): 关于

作者: luisxu | 来源:发表于2017-03-14 21:40 被阅读184次

原文地址: https://medium.com/google-developers/android-data-binding-that-include-thing-1c8791dd6038#.jxnxq3463

上篇文章中, 讲述了在Android Studio1.5及之后的版本上, 使用data binding来替代findViewById是多么简单的一件事. 我展示了如何使用Android Studio来基于layout文件生成一个类似ViewHolder的类.但是如果layout中使用了 "include" 或 "merge"标签怎么办?

Data Binding默认也支持这些标签, 但是每个layout文件都会被生成一个不同的类. 例如

hello_world.xml
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">

        <TextView
                android:id="@+id/hello"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"/>
        <include
                android:id="@+id/included"
                layout="@layout/included_layout"/>
    </LinearLayout>
</layout>
included_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/world"/>
</layout>

需要用下面的方式来访问不同的TextView:

HelloWorldBinding binding =
    HelloWorldBinding.inflate(getLayoutInflater());
binding.hello.setText(“Hello”);
binding.included.world.setText(“World”);

include标签的命名规则跟View的命名规则是一样的: "include"标签的id被
当作成员变量名. 被include的layout文件会生成一个自己的类, 里面的view
也会被赋值给成员变量. 开发者也可以很容易的分别共享的id, 例如如果你
include了一个layout两次:

<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">

        <TextView
                android:id="@+id/hello"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"/>
        <include
                android:id="@+id/world1"
                layout="@layout/included_layout"/>
        <include
                android:id="@+id/world2"
                layout="@layout/included_layout"/>
    </LinearLayout>
</layout>

同名的"world" TextView可以很容易被访问:

HelloWorldBinding binding =
    HelloWorldBinding.inflate(getLayoutInflater());
binding.hello.setText(“Hello”);
binding.world1.world.setText(“First World”);
binding.world2.world.setText(“Second World”);

记住要给include标签一个id, 否则不会为其生成公共成员变量. 同时,记住在外面
使用 <layout> 标签. 这回触发预处理过程, 生成类并绑定view.

如果你去查看生成的类, 会发现无论被include多少次, 他们使用的都是同一个类.
例如你有另外一个layout文件goodbye_world.xml也包含了included_layout.xml文件,那么只会生成一个类.

相关文章

网友评论

    本文标题:[翻译] Android Data Binding(2): 关于

    本文链接:https://www.haomeiwen.com/subject/rokknttx.html