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)
声明您的 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
.
归档时间: |
|
查看次数: |
5640 次 |
最近记录: |