2016-01-11 4 views
9

Есть ли способ использовать viewStubs с привязкой данных? может помочь ViewStubProxy?Android Data Binding - как использовать ViewStub с привязкой данных

Мой окурок ток выглядит следующим образом:

<ViewStub 
    android:id="@+id/stub_import" 
    android:inflatedId="@+id/panel_import" 

    android:layout="@layout/progress_overlay" 

    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_gravity="@{myobject.bottom ? bottom:top}" /> 

Но эта схема будет заменена, когда я надуть viewStub так как ViewStubs может быть использован с андроид Databinding?

это то, что я вижу из docs:

ViewStubs

ViewStubs немного отличаются от обычных представлений. Они начинают невидимыми, и когда они либо становятся видимыми, либо явно сообщаются , чтобы раздуть, они заменяют себя в макете, раздувая еще один макет .

Поскольку ViewStub по существу исчезает из иерархии View, View в объекте привязки также должен исчезнуть, чтобы разрешить сбор . Поскольку представления являются окончательными, объект ViewStubProxy принимает место ViewStub, предоставляя разработчику доступ к ViewStub , когда он существует, а также доступ к завышенной иерархии представлений, когда затухает ViewStub .

При раздувании другого макета необходимо установить привязку для нового макета . Поэтому ViewStubProxy должен прослушать ViewStub ViewStub.OnInflateListener и установить привязку в это время. Поскольку только один может существовать, ViewStubProxy позволяет разработчику установить на него OnInflateListener, который он вызовет после установления связи .

ответ

11

Просто установите слушателя в док говорит:

mBinding.viewStub.setOnInflateListener(new ViewStub.OnInflateListener() { 
    @Override 
    public void onInflate(ViewStub stub, View inflated) { 
     ViewStubBinding binding = DataBindingUtil.bind(inflated); 
     binding.setModel(model); 
    } 
}); 



public void inflateViewStub(View view) { 
    if (!mBinding.viewStub.isInflated()) { 
     mBinding.viewStub.getViewStub().inflate(); 
    } 
} 
+1

Как примечание, 'ViewStubBinding 'не является классом, это класс привязки для заглушки представления. Мне потребовалось некоторое время, чтобы понять это; надеюсь, этот комментарий поможет кому-то другому. – BlackHatSamurai

0

Установите слушателя, чтобы получить доступ к надутой макете после успешного раздувания viewStub

mBinding.viewStub.setOnInflateListener(new OnInflateListener() { 
    @Override 
    public void onInflate(ViewStub stub, View inflated) { 
    ViewStubBinding binding = DataBindingUtil.bind(inflated); //call after succesful inflating of viewStub 
    // set data here 
    } 
}); 

то надуть viewStub

mBinding.viewStub.getViewStub().inflate(); 
0

Объявите пространство имен xml и передайте переменную через это. Это работает также с <include>, кстати. Вот пример:

main_layout.xml:

<layout xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:my-namespace="http://schemas.android.com/apk/res-auto"> 
    <data> 
     <variable name="myData" type="com.example.SomeModel" /> 
    </data> 

    <RelativeLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"> 

     <ViewStub 
      android:id="@+id/view_stub" 
      android:inflatedId="@+id/view" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout="@layout/another_layout" 
      my-namespace:data="@{myData}" 
      /> 

    </RelativeLayout> 
</layout> 

another_layout.xml:

<layout xmlns:android="http://schemas.android.com/apk/res/android"> 
<!-- No need to declare my-namespace here --> 
    <data> 
     <variable name="data" type="com.example.SomeModel" /> 
    </data> 

    <RelativeLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"> 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="@{data.someValue}" /> 

    </RelativeLayout> 
</layout> 

Итак, теперь вы просто должны позвонить inflate() и макет будет иметь данные. Чтобы проверить это, вы можете проверить сгенерированный класс привязки. Он даже имеет тип безопасности, поэтому вы не можете передавать какой-либо другой тип в data.

0

Я также столкнулся с этим типом проблем, Наконец-то я получил решение и его безупречную работу.

ViewStub Holding Компоновка ,,

<?xml version="1.0" encoding="utf-8"?> 
<layout xmlns:android="http://schemas.android.com/apk/res/android"> 

    <data class="MBinding"> 

     <variable 
      name="mmmmm" 
      type="com.vvv.bbb.fragments.MFragment" /> 

    </data> 
    -------------------- 
    -------------------- 
    <ViewStub 
    android:id="@+id/stub_import" 
    ------------------- 
    ------------------- 
     <ViewStub/> 
    -------------------- 
    -------------------- 
<layout/> 

расположение Внутри ViewStub есть ,,,

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

    <data class="MViewStubLayoutBinding"> 

     <variable 
      name="mmmmm" 
      type="com.vvv.bbb.fragments.MFragment" /> 

    </data> 
    ---------------- 
    ---------------- 
    ---------------- 

код Внутри класса является ,,,

public Class KKKKKK() { 
----------------- 
MBinding mBinding; 
MViewStubLayoutBinding mviewStubLayoutBinding; 

----------------------------- 
----------------------------- 

mBinding.stubImport.getViewStub().setLayoutResource(R.layout.progress_overlay); 

    mBinding.stubImport.setOnInflateListener(new ViewStub.OnInflateListener() { 
      @Override 
      public void onInflate(ViewStub viewStub, View view) { 
       mviewStubLayoutBinding=DataBindingUtil.bind(view); 
      } 
     }); 

     autoCheckBinding.vsAutoDetailsOne.getViewStub().inflate();