2016-04-04 23 views
9

Tôi đang sử dụng khung MVVM cho ứng dụng Android có thư viện ràng buộc dữ liệu.Android bao gồm bố cục động với thư viện ràng buộc dữ liệu

Tôi có một số compoment có thể tái sử dụng, nên có mọi hoạt động. f.e. thanh công cụ, menu, nút tác vụ nổi.

Tôi muốn tạo một hoạt động chung, sẽ thực hiện tất cả các tính năng có thể tái sử dụng này và sau đó mọi lớp hoạt động sẽ được kế thừa từ hoạt động chung này. Tôi cũng có lớp GenericViewModel và mọi ViewModel khác được kế thừa từ lớp chung này.

Nhưng tôi gặp sự cố với bố cục. Tôi muốn tạo file layout chung và bao gồm sublayout dinamically. 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> 

Tôi không muốn sao chép/dán mã này cho từng hoạt động, nhưng thư viện ràng buộc dữ liệu không cho phép bao gồm bố cục động. Có giải pháp nào cho những trường hợp như vậy không?

Trả lời

0

Đây là giải pháp của tôi, hy vọng nó sẽ giúp bạn, tôi không nghĩ rằng đó là một cách tốt. Nếu bạn tìm thấy một cách tốt hơn, xin vui lòng cho tôi biết.

Mặc dù thư viện ràng buộc dữ liệu không cho phép bao gồm bố cục động, chúng tôi có thể sử dụng ViewModel khác nhau cho bố cục khác nhau .Tôi đã sử dụng LinearLayout làm vùng chứa để lưu trữ bố cục động, sau đó ghi đè phương thức Activity setContentView để thêm chế độ xem vào vùng chứa của tôi (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); 
} 

bố trí 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> 

Trong Hoạt động cụ thể bạn sử dụng nó như thế này:

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

Đối với tôi, không cần sao chép dán bố cục chung cho mọi hoạt động nữa.

+0

Cảm ơn, nó rất hữu ích cho tôi –

Các vấn đề liên quan