Android数据绑定 - 如何使用ViewStub进行数据绑定

j2e*_*nue 14 data-binding android viewstub

无论如何使用viewStubs与dataBinding?可以ViewStubProxy帮忙吗?

我的存根当前看起来像这样:

    <ViewStub
  android:id="@+id/stub_import"
  android:inflatedId="@+id/panel_import"

  android:layout="@layout/progress_overlay"

  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:layout_gravity="@{myobject.bottom ? bottom:top}" />
Run Code Online (Sandbox Code Playgroud)

但是当我给viewStub充气时,这个布局会被取代,所以ViewStubs如何与android dataBinding一起使用?

这是我从文档中看到的:

ViewStubs

ViewStubs与普通视图略有不同.它们开始是不可见的,当它们要么被显示或被明确告知要膨胀时,它们会通过膨胀另一个布局来替换它们.

由于ViewStub基本上从View层次结构中消失,因此绑定对象中的View也必须消失以允许收集.由于视图是最终的,因此ViewStubProxy对象取代了ViewStub,使开发人员在ViewStub存在时可以访问ViewStub,并且在ViewStub膨胀时也可以访问膨胀的View层次结构.

在膨胀另一个布局时,必须为新布局建立绑定.因此,ViewStubProxy必须侦听ViewStub的ViewStub.OnInflateListener并在那时建立绑定.由于只有一个可以存在,ViewStubProxy允许开发人员在其上设置一个OnInflateListener,它将在建立绑定后调用它.

And*_*sen 18

只需将监听器设置为doc说:

mBinding.viewStub.setOnInflateListener(new ViewStub.OnInflateListener() {
    @Override
    public void onInflate(ViewStub stub, View inflated) {
        ViewStubBinding binding = DataBindingUtil.bind(inflated);
        binding.setModel(model);
    }
});



public void inflateViewStub(View view) {
    if (!mBinding.viewStub.isInflated()) {
        mBinding.viewStub.getViewStub().inflate();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 注意,`ViewStubBinding`不是类,它是视图存根的绑定类.我花了一段时间来弄明白这一点; 希望这条评论能帮助别人. (5认同)
  • 无法解析符号"ViewStubBinding".对此有何解决方案? (2认同)
  • @Jatin ViewStubBinding 是一个生成的类。如果您的 xml 名称是 jatin_activity ,那么它将是 JatingActivityBinding (2认同)

Ved*_*hat 7

声明您的 xml 命名空间,并通过它传递变量。这也适用于<include>顺便说一句。下面是一个例子:

main_layout.xml:

<layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:my-namespace="http://schemas.android.com/apk/res-auto">
    <data>
        <variable name="myData" type="com.example.SomeModel" />
    </data>

    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">

        <ViewStub
            android:id="@+id/view_stub"
            android:inflatedId="@+id/view"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout="@layout/another_layout"
            my-namespace:data="@{myData}"
            />

    </RelativeLayout>
</layout>
Run Code Online (Sandbox Code Playgroud)

another_layout.xml:

<layout xmlns:android="http://schemas.android.com/apk/res/android">
<!-- No need to declare my-namespace here -->
    <data>
        <variable name="data" type="com.example.SomeModel" />
    </data>

    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{data.someValue}" />

    </RelativeLayout>
</layout>
Run Code Online (Sandbox Code Playgroud)

所以现在你只需要调用inflate(),布局就会有数据。您可以检查生成的绑定类来验证这一点。它甚至具有类型安全性,因此您不能将任何其他类型传递到data.