2015-12-08 12 views
6

Ich habe folgendes Layout (nur relevante Teile links):Android Datenbindung gesetzt alignParentTop

<RelativeLayout> 
    <View android:layout_alignParentTop="true"/> 
</RelativeLayout> 

Ich habe versucht Einstellung layout_alignParentTop Attribute mit Variable in <data> Block deklariert, wie hier gezeigt:

<data> 
    <variable 
     name="condition" 
     type="Boolean"/> 
</data> 

<RelativeLayout> 
    <View android:layout_alignParentTop="@{condition}"/> 
</RelativeLayout> 

jedoch bei dem Versuch, um zu kompilieren, sagt android studio folgendes:

Error: Cannot find the setter for attribute 'android:layout_alignParentTop' with parameter type java.lang.Boolean.

Wie kann ich das Attribut layout_alignParentTop mit der Datenbindungsvariablen festlegen?

+0

es Groß- und Kleinschreibung sein könnte? Hast du 'boolean' mit einem Kleinbuchstaben B probiert? – AdamMc331

+0

@ McAdam331 Ich habe es gerade mit 'boolean' versucht, funktioniert immer noch nicht, Fehler ist der gleiche – Mikhail

Antwort

13

Ich musste etwas hinein graben und fand eine recent issue in Google Code.

einen der Projektmitglieder zu zitieren:

We explicitly did not support data binding for layout properties, though you could technically add them yourself. The problem is that these can be easily abused with people trying to animate them.

To implement these for your application, create a binding adapter:

@BindingAdapter("android:layout_width") 
public static void setLayoutWidth(View view, int width) { 
    LayoutParams layoutParams = view.getLayoutParams(); 
    layoutParams.width = width; 
    view.setLayoutParams(layoutParams); 
} 

In Ihrem Fall würden Sie brauchen nur sie für die alignParentTop Attribute leicht anzupassen:

@BindingAdapter("android:layout_alignParentTop") 
public static void setAlignParentTop(View view, boolean alignParentTop) { 
    RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(
     RelativeLayout.LayoutParams.WRAP_CONTENT, 
     RelativeLayout.LayoutParams.WRAP_CONTENT); 

    if(alignParentTop) { 
     layoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP); 
    } 

    view.setLayoutParams(layoutParams); 
} 

Dies ist nicht getestet, aber es sollte sein genug, um Sie auf die richtige Spur zu bringen.

+1

Ich implementierte es durch' @ BindingAdapter' aber hoffte auf eleganter Weise. Danke trotzdem! – Mikhail

+0

@Arkadiy froh zu helfen! Ich bin froh, dass meine 500. Antwort eine gute war, haha. Entschuldige, dass es keinen anderen Weg gibt, aber zumindest weißt du jetzt sicher, dass es keinen gibt. – AdamMc331

+0

Nur eine Anmerkung für zukünftige Leser: dieser Code sowie alle anderen Instanzen von '@ BindingAdapter' können in jede Klasse platziert werden, die Sie mögen (zB ein frisch erstelltes' BindingAdapters.java'). Es wird dann während des Datenbindungsprozesses erkannt und ermöglicht, dass die Kompilierung ohne Fehler wie dem in der Frage erwähnten fortfährt. –

1
@BindingAdapter("android:layout_alignParentLeft") 
public static void setAlignParentLeft(View view, boolean alignParentLeft) { 
    RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(
      view.getLayoutParams() 
    ); 

    if (alignParentLeft) { 
     layoutParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT); 
    } 

    view.setLayoutParams(layoutParams); 
} 

dieser Code ist universeller und gilt nicht wrap_content für jede Ansicht

Verwandte Themen