【问题标题】:Android include layout dynamically with data-binding libraryAndroid 使用数据绑定库动态包含布局
【发布时间】:2016-07-24 02:08:03
【问题描述】:

我正在为带有数据绑定库的 Android 应用程序使用 MVVM 框架。

我有一些可重复使用的组件,应该包含所有活动。 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>

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

【问题讨论】:

    标签: android mvvm android-databinding


    【解决方案1】:

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

    虽然数据绑定库不允许动态包含布局,但我们可以为不同的布局使用不同的 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);
    }
    

    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>
    

    在具体的 Activity 中你可以这样使用它:

    具体活动

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

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

    【讨论】:

    • 谢谢,对我很有帮助
    猜你喜欢
    • 1970-01-01
    • 2016-03-21
    • 2021-07-01
    • 2017-01-19
    • 2011-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-09
    相关资源
    最近更新 更多