2016-02-23 7 views
13

Sto tentando di utilizzare l'associazione dati con visualizzazioni personalizzate (un possibile utilizzo di George Mount ha mostrato here).L'associazione dati Android non funziona con gli attributi <merge>

Non si può immaginare di costruire viste composte senza il tag <merge>. Tuttavia, in questa situazione associazione dati fallisce:

MyCompoundView classe:

public class MyCompoundView extends RelativeLayout { 

MyCompoundViewBinding binding; 

public MyCompoundView (Context context, AttributeSet attrs) { 
    super(context, attrs); 
    init(context); 
} 

private void init(Context context){ 
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    binding = MyCompoundViewBinding.inflate(inflater, this, true); 
} 

my_compound_view.xml: da app:isGone="@{!data.isViewVisible}" ho sperato per controllare la visibilità di tutta la vista composita

<?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> 
     <variable name="data" type="com.example.MyViewModel"/> 
    </data> 

    <merge 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     app:isGone="@{!data.isViewVisible}"> 

     <ImageView 
      android:id="@+id/image_image" 
      android:layout_width="60dp" 
      android:layout_height="60dp" 
      app:imageUrl="@{data.imagePhotoUrl}"/> 

     <!-- tons of other views--> 

    </merge> 

</layout> 

Gli errori di compilatore:

Error:(13) No resource identifier found for attribute 'isGone' in package 'com.example' 
Error:(17, 21) No resource type specified (at 'isGone' with value '@{!data.isViewVisible}'). 

Ho tutto il necessario d metodi @BindingAdapter. Ora ereditare la vista da FrameLayout e utilizzare <RelativeLayout> anziché <merge> e funziona. Ma ho un layout annidato in più.

Domanda:merge attrs sono ignorati. C'è un modo per aggirare questo?

Android Studio 1.5.1 stabile

Gradle plug com.android.tools.build:gradle:1.5.0

+0

è meglio se si utilizza anziché . –

+2

@Rakeeb Rajbhandari, sì, il databinding funziona bene con il tag ''. Tuttavia, questo non risolverà il problema del viewgroup aggiuntivo mentre si gonfia la visualizzazione personalizzata. –

+0

Si prega di dare un'occhiata alla mia domanda. Sto usando include tag e inner class. https://stackoverflow.com/q/45143721/5214893 –

risposta

8

Non v'è alcun oggetto unione dopo l'inflazione, quindi non c'è nulla da assegnare valori a con un tag di unione. Non riesco a pensare a nessun tag vincolante che funzioni per unire.

È possibile assegnare il tag all'elemento principale e utilizzare il BindingAdapter per fare ciò che si desidera.

<layout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    > 

    <data> 
     <variable name="data" type="com.example.MyViewModel"/> 
    </data> 

    <merge 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"> 
     <ImageView 
      app:isGone="@{!data.isViewVisible}" 
      android:id="@+id/image_image" 
      android:layout_width="60dp" 
      android:layout_height="60dp" 
      app:imageUrl="@{data.imagePhotoUrl}"/> 
     <!-- tons of other views--> 
    </merge> 
</layout> 

Se si vuole fare qualcosa con la classe Binding in sé, è possibile utilizzare il DataBindingUtil per trovare l'oggetto della vista.

@BindingAdapter("isGone") 
public static void setGone(View view, boolean isGone) { 
    ViewDataBinding binding = DataBindingUtil.findBinding(view); 
    //... do what you want with the binding. 
} 
+2

Gli sviluppatori Android esattamente ne hanno parlato in [documentazione] (https://developer.android.com/topic/libraries/data-binding/index.html # layout_details) – MrOnyszko

+0

Potresti elaborare il tuo consiglio con un po 'di codice? Grazie :) –

+2

Ciao, non riesco a far funzionare il tag di unione. Mostra l'errore "L'unione di elementi non è consentita qui". Vedi: https://pastebin.com/QhQKYN71 –

0

Da documentazione Android (Data Binding Library: Includes)

Le variabili possono essere passati in un layout di incluso associazione dal contenente il layout utilizzando lo spazio di applicazione e il nome della variabile in un attributo

<?xml version="1.0" encoding="utf-8"?> 
<layout xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:bind="http://schemas.android.com/apk/res-auto"> 
    <data> 
     <variable name="user" type="com.example.User"/> 
    </data> 
    <LinearLayout 
     android:orientation="vertical" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 
     <include layout="@layout/name" 
      bind:user="@{user}"/> 
     <include layout="@layout/contact" 
      bind:user="@{user}"/> 
    </LinearLayout> 
</layout> 

Ricordarsi di passare nell'oggetto di associazione dati in il tag <include> (in questo esempio: bind:[email protected]{user}) e aggiungere xmlns:bind="http://schemas.android.com/apk/res-auto" nella parte superiore.