Android使用数据绑定库dynamic地包含布局

我正在使用数据绑定库的Android应用MVVM框架。

我有一些可重用的组件,应该有所有的活动。 fe工具栏,菜单,浮动操作button。

我想创build一个通用的活动,将实现所有这些可重用的function,然后每个活动类将从这个通用的活动inheritance。 我也有GenericViewModel类,每个其他ViewModel从这个generics类inheritance。

但是我有一个布局问题。 我想要创build通用的布局文件,并在其中包含sublayout。 FE

<?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> 

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

Solutions Collecting From Web of "Android使用数据绑定库dynamic地包含布局"

这是我的解决scheme,希望能帮到你,我不认为这是一个好方法。如果你find更好的方法,请告诉我。谢谢!

尽pipe数据绑定库不允许dynamic包含布局,但是我们可以使用不同的ViewModel来进行不同的布局。我使用LinearLayout作为容器来托pipedynamic布局,然后重写Activity的setContentView方法来将视图添加到我的容器(LinearLayout)中。

GenericActivity

  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); } 

generic_view布局

  <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> 

在具体的活动中,你使用它是这样的:

ConcreteActivity

 //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. ... } 

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