簡體   English   中英

Android包含數據綁定庫動態布局

[英]Android include layout dynamically with data-binding library

我正在使用帶有數據綁定庫的Android應用程序的MVVM框架。

我有一些可重復使用的組件,應該包含所有活動。 fe工具欄,菜單,浮動動作按鈕。

我想創建一個通用活動,它將實現所有這些可重用的功能,然后每個活動類將從這個通用活動繼承。 我還有GenericViewModel類,並且每個其他ViewModel都繼承自這個泛型類。

但我的布局有問題。 我想創建通用布局文件,並在那里包含sublayout dinamically。 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>

我不想為每個活動復制/粘貼此代碼,但數據綁定庫不允許動態包含布局。 這種情況有解決方案嗎?

這是我的解決方案,希望它會對你有所幫助,我認為這不是一個好方法。如果你找到更好的方法,請告訴我。謝謝!

雖然數據綁定庫不允許動態包含布局,但我們可以使用不同的ViewModel進行不同的布局。我使用LinearLayout作為容器來托管動態布局,然后重寫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>

在具體的Activity中,您可以像這樣使用它:

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

對我來說,不再需要為每個活動復制粘貼通用布局。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM