Android包含动态布局和数据绑定库

Android包含动态布局和数据绑定库,android,mvvm,android-databinding,Android,Mvvm,Android Databinding,我正在使用MVVM framework for Android应用程序和数据绑定库 我有一些可重用的组件,它们应该包含所有活动。f、 e.工具栏、菜单、浮动操作按钮 我想创建一个通用活动,它将实现所有这些可重用的特性,然后每个活动类都将继承自这个通用活动。我还有GenericViewModel类,其他所有ViewModel都是从这个泛型类继承的 但我对布局有问题。我想创建通用布局文件,并在其中包含子布局。f、 e <?xml version="1.0" encoding="utf-

我正在使用MVVM framework for Android应用程序和数据绑定库

我有一些可重用的组件,它们应该包含所有活动。f、 e.工具栏、菜单、浮动操作按钮

我想创建一个通用活动,它将实现所有这些可重用的特性,然后每个活动类都将继承自这个通用活动。我还有GenericViewModel类,其他所有ViewModel都是从这个泛型类继承的

但我对布局有问题。我想创建通用布局文件,并在其中包含子布局。f、 e

    <?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <data>

        <variable
            name="data"
            type="com.mypackage.genericViewModel" />
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <include
            bind:data="@{data}"
            layout="@layout/toolbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <include
            layout="@{Here i want to have dynamic variable}"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    </LinearLayout></layout>


我不想为每个活动复制/粘贴此代码,但数据绑定库不允许动态包含布局。这种情况有什么解决办法吗?

这是我的解决办法,希望能对你有所帮助,我认为这不是一个好办法。如果你找到更好的办法,请告诉我。谢谢

虽然数据绑定库不允许动态包含布局,但我们可以为不同的布局使用不同的ViewModel。我使用LinearLayout作为容器来承载动态布局,然后重写Activity setContentView方法以将视图添加到我的容器(LinearLayout)

通用性

    protected GenericViewBinding mBinding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);           
        mBinding = DataBindingUtil.setContentView(this, R.layout.generic_view);        
}

    @Override
    public void setContentView(View view) {
        LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
        mBinding.container.addView(view,lp);
}
//different layout use different ViewModel here,generic logic&layout is in GenericActivity&generic_view layout.
private ActivityConcreteBinding mActivityConcreteBinding;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mActivityConcreteBinding = DataBindingUtil.inflate(getLayoutInflater(), R.layout.activity_concrete,null,false);
    setContentView(mActivityConcreteBinding.getRoot());
    ConcreteViewModel concreteViewModel = new ConcreteViewModel(mBinding);//mBinding from GenericActivity, deliver it into ConcreteViewModel to do some generic logic.
    ...
}
通用视图布局

    <data>
        <variable
            name="genericViewModel"
            type=".viewModel.GenericViewModel"/>
    </data>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@android:color/white">
        <!--a custom view,some generic layout -->
        <.view.base.BaseTitleView 
            android:id="@+id/base_title"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>
        <LinearLayout
            android:id="@+id/container"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_below="@id/base_title"
            android:orientation="vertical">
        </LinearLayout>
    </RelativeLayout>

对我来说,不再需要为每个活动复制粘贴通用布局。

谢谢,这对我很有帮助