美文网首页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