2015-12-08 7 views
6

Mam następujący układ (tylko odpowiednie części lewej):Android wiązania z danymi ustawić alignParentTop

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

Próbowałem ustawień layout_alignParentTop atrybutu ze zmiennej zadeklarowanej w <data> bloku, jak pokazano tutaj:

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

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

Jednak podczas próby do skompilowania, android studio mówi:

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

Jak ustawić atrybut layout_alignParentTop za pomocą zmiennej wiązania danych?

+0

mogło być wielkość liter? Czy próbowałeś 'boolean' z małą literą B? – AdamMc331

+0

@ McAdam331 Właśnie próbowałem go z 'boolean', nadal nie działa, błąd jest taki sam – Mikhail

Odpowiedz

13

Musiałem trochę w to wkopać i znalazłem recent issue w Google Code.

Cytując jednego z członków projektu:

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); 
} 

W twoim przypadku to po prostu trzeba dostosować go lekko do atrybutu alignParentTop:

@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); 
} 

To niesprawdzone, ale powinno być wystarczy, aby uzyskać właściwy tor.

+1

Zaimplementowałem go poprzez' @ BindingAdapter', ale mam nadzieję na bardziej elegancki sposób. Dzięki i tak! – Mikhail

+0

@Arkadiy chętnie pomoże! Cieszę się, że moja 500-ta odpowiedź była dobra, haha. Przepraszam, że nie ma innej drogi, ale przynajmniej teraz wiesz na pewno, że nie ma. – AdamMc331

+0

Tylko uwaga dla przyszłych czytelników: ten kod, jak również wszelkie inne wystąpienia '@ BindingAdapter 'można umieścić w dowolnej klasie, którą lubisz (np. Świeżo utworzonego' BindingAdapters.java'). Zostanie to rozpoznane podczas procesu wiązania danych i pozwoli kompilacji kontynuować błędy w/w, jak wspomniane w pytaniu. –

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); 
} 

ten kod jest bardziej uniwersalny i nie ma zastosowania wrap_content dla każdego widoku