2016-04-04 22 views
9

Veri bağlama kitaplığına sahip Android uygulaması için MVVM framework kullanıyorum.Android, veri bağlama kitaplığı ile dinamik olarak düzeni içerir

Yeniden kullanılabilir bazı komponentlerim var, bu her aktiviteye sahip olmalı. F. E. araç çubuğu, menü, hareketli eylem düğmesi.

Tüm bu yeniden kullanılabilir özellikleri gerçekleştirecek bir genel etkinlik oluşturmak ve daha sonra her etkinlik sınıfı bu genel etkinlikten miras alınacaktır. Ayrıca GenericViewModel sınıfına sahibim ve diğer tüm ViewModel bu genel sınıftan miras alınır.

Ancak düzen ile ilgili bir sorunum var. Genel düzen dosyası oluşturmak ve altyazıyı dinamik olarak eklemek istiyorum. 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> 

ben her etkinlik için bu kodu/kopyalamak yapıştırmak istemiyorum, ama veri bağlama kütüphane dinamik düzeni dahil etmek izin vermez. Bu gibi durumlarda herhangi bir çözüm var mı?

cevap

0

İşte benim çözümüm, size yardımcı olacağını umuyorum, bunun iyi bir yol olduğunu düşünmüyorum. Daha iyi bir yol bulursanız, lütfen bana söyleyin.

Veri bağlama kitaplığı düzeni dinamik olarak dahil etmesine izin vermese de, farklı düzen için farklı ViewModel kullanabiliriz. Dinamik yerleşimi barındırmak için bir kapsayıcı olarak bir LinearLayout kullandık, ardından kapsayıcıma görünüm eklemek için Activity setContentView yöntemini geçersiz kıldım. 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 düzeni beton Bir Etkinlikte

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

Eğer bu gibi kullanmak:

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

Benim için herhangi bir işlem için yapıştırıcı genel düzenini kopyalamaya gerek yok.

+0

Teşekkürler, bana yardımcı oldu –

İlgili konular