Android数据绑定:如何绑定布局标识符以包含

时间:2017-04-07 13:06:56

标签: android android-databinding

我希望包含一个带数据绑定的布局。

我想使用enum将id从java传递到我的布局,但我似乎无法找到正确的语法。

这是我的Fragment类,其中包含enumonCreateView()

private enum TYPE{
    A(R.layout.fragment_item_A),
    B(R.layout.fragment_item_B),
    C(R.layout.fragment_item_C);

    public final int id;
    TYPE(int id) {
        this.id = id;
    }
    private int getId(){
        return id;
    }
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    //...
    this.type = TYPE.A;
    FragmentItemBinding binding = DataBindingUtil.inflate(inflater, R.layout.fragment_item, container, false);
    tmpView = binding.getRoot();
    binding.setType(type);
    //...
    return tmpView;
}

我想要充气R.layout.fragment_item并将其包含R.layout.fragment_item_A(或其他类型)。

这是我在R.layout.fragment_item XML文件中的失败尝试:

<data>
    <variable name="type" type="com.dan.myapp.fragments.MyFragmentClass.TYPE"/>
...
</data>
<include layout="@{type.id}" <!-- layout="@layout/fragment_item_A"-->
         android:id="@+id/included_item"/>

我应该如何在include中编写绑定?

PS:答案可能在this postthis one,但我找不到......

1 个答案:

答案 0 :(得分:2)

我很确定你做不到。数据绑定需要编译类型的布局,以便它可以确定传递变量的类型等。

相反,我认为你可能会这样做:

<FrameLayout ...>
    <ViewStub android:layout="@layout/fragment_item_a"
              android:visibility="@{type == Type.A ? View.VISIBLE : View.GONE}" .../>
    <ViewStub android:layout="@layout/fragment_item_b"
              android:visibility="@{type == Type.B ? View.VISIBLE : View.GONE}" .../>
    <ViewStub android:layout="@layout/fragment_item_c"
              android:visibility="@{type == Type.C ? View.VISIBLE : View.GONE}" .../>
</FrameLayout>