2016-04-04 12 views
5

Ho 2 layout: uno per V19 + e un altro per le versioni precedenti. Contengono viste diverse con ID diversi. Come posso dire il framework Android DataBinding che voglio lavorare con entrambi i layout? Genera viste solo per un layout (seleziona casualmente).Come associare il layout a più qualificazioni

layout/temp_view.xml:

<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="block" 
      type="ru.temp.model.content.blocks.WebMediaBlock" /> 

     <import type="ru.temp.model.Types.ProviderTypes" /> 

    </data> 

    <FrameLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" 
     tools:background="@android:color/white"> 

     <ImageView 
      android:id="@+id/provider" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center_horizontal" 
      android:paddingTop="@dimen/size5" 
      android:src="@{ProviderTypes.fromString(block.provider).getResId()}" /> 
    </FrameLayout> 
</layout> 

Layout-V19/temp_view.xml:

<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="block" 
      type="ru.temp.model.content.blocks.WebMediaBlock" /> 

     <import type="ru.temp.model.Types.ProviderTypes" /> 

    </data> 

    <FrameLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" 
     tools:background="@android:color/white"> 
     <ru.temp.utils.EmbedView 
      android:id="@+id/media_embed" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" /> 

     <ru.temp.structure.static_material.CreditsView 
      android:id="@+id/credits_view" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" /> 
    </FrameLayout> 
</layout> 

Aggiornamento:

Finalmente ho trovato la radice del problema. Non so perché ma non genera file * BindingImpl quando si utilizza minSdkVersion 21. Se si specifica versioni precedenti funziona come detto @yigit

+0

È inoltre possibile controllare [questo] (http://chintanrathod.com/develop_apps_faster_using_data_binding_part2/) tutorial per riferimento. –

+0

Non copre i dettagli del problema – LackOfKnowledge

risposta

1

L'associazione dati genererà una classe base che funge da interfaccia comune per entrambi (la variabili). L'associazione dei dati si occuperà di creare l'istanza corretta quando si chiama DataBindingUtil.setContentView(activity, R.layout.tmp_view).

Per esempio, nel tuo esempio, genererà

TempViewBinding, TempViewBindingImpl e TempViewBindingV19Impl. È possibile controllare queste classi all'interno di <app module>/build/intermediates/classes/<your package>/databinding/ dopo la compilazione.

TempViewBinding è la classe base e avrà la combinazione di variabili e viste per ogni layout. Se non li vedi nell'IDE, potrebbe essere un bug di completamento automatico in AS (si prega di file un bug).

+0

Sfortunatamente non genera tali classi Impl. E non riesco a trovare le informazioni che hai fornito sui documenti ufficiali. Impossibile determinare cosa sto facendo male – LackOfKnowledge

+0

se riesci a caricare un progetto di esempio, sono felice di vederlo – yigit

+0

scusate per una risposta in ritardo ma ha avuto molto tempo per rilevare il problema. Si prega di controllare l'aggiornamento della testa. E guarda il progetto di test (ramo principale) https://github.com/rchugunov/buzzer Nella versione attuale il databinding non genera file Impl. Ma se si imposta minSdkVersion 15 in build.gradle lo farà! – LackOfKnowledge