2016-02-23 4 views
13

Ich versuche Datenbindung mit benutzerdefinierten Ansichten zu verwenden (eine mögliche Verwendung George Mount zeigte here).Android-Datenbindung funktioniert nicht mit <merge> Attribute

Man kann sich nicht vorstellen, zusammengesetzte Ansichten ohne <merge> Tag zu erstellen. Doch in dieser Situation Datenbindung nicht:

MyCompoundView Klasse:

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: von app:isGone="@{!data.isViewVisible}" Ich hoffte, die Sichtbarkeit der gesamten Verbindung Ansicht zu steuern

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

Der Compiler-Fehler:

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

Ich habe alle neede d @BindingAdapter Methoden. Jetzt erben ich die Ansicht von FrameLayout und verwende <RelativeLayout> statt <merge> - und es funktioniert. Aber ich habe ein extra verschachteltes Layout.

Frage:merge attrs werden ignoriert. Gibt es eine Möglichkeit, das zu umgehen?

Android Studio 1.5.1 stabil

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

+0

ist es am besten, wenn Sie anstelle von verwenden. –

+2

@Rakeeb Rajbhandari, ja, Databinding funktioniert ok mit '' Tag. Dies löst jedoch nicht das Problem der zusätzlichen Ansichtsgruppe beim Aufblasen der benutzerdefinierten Ansicht. –

+0

Bitte werfen Sie einen Blick auf meine Frage. Ich verwende Include-Tag und innere Klasse. https://StackOverflow.com/q/45143721/5214893 –

Antwort

8

Es gibt kein merge Objekt nach dem Aufblasen, so gibt es nichts zu Werten zuweisen, um mit einem Merge-Tag. Ich kann mir kein bindendes Tag vorstellen, das bei der Zusammenführung funktioniert.

Sie können das Tag dem Stammelement zuweisen und den BindingAdapter verwenden, um das zu tun, was Sie möchten.

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

Wenn Sie etwas mit der Binding-Klasse zu tun, wollen selbst, können Sie die DataBindingUtil verwenden das Objekt aus dem Blick zu finden.

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

Genau Android Entwickler erwähnt darüber in [Dokumentation] (https://developer.android.com/topic/libraries/data-binding/index.html # layout_details) – MrOnyszko

+0

Können Sie Ihren Rat mit etwas Code ausarbeiten? Danke :) –

+2

Hallo, ich kann das Merge-Tag nicht funktionieren. Es zeigt den Fehler 'Element merge ist hier nicht erlaubt'. Siehe: https://pastebin.com/QhQKYN71 –

0

Von Android-Dokumentation (Data Binding Library: Includes)

Variablen kann unter Verwendung des Anwendungsnamensraum und die Variable Namen in einem Attribut

aus dem enthalten Layout in ein eingeschlossener Layout der Bindung übergeben werden
<?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> 

Denken Sie daran, das Datenbindungsobjekt in übergeben das <include> Tag (in diesem Beispiel: bind:[email protected]{user}), und fügen Sie xmlns:bind="http://schemas.android.com/apk/res-auto" an der Spitze hinzu.